реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> реализация логера
HEX
сообщение Feb 9 2009, 11:56
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228



Может кому пригодиться.
Сама идея описана здесь, вот еще статья на эту тему, спасибо авторам.

Log.h
Код
#ifndef LOG_H
#define LOG_H
#include "Config.h"
#include <stdbool.h>
#if (LOG_LEVEL > 0)
  #include <iostream>
#endif

//Приоритеты (типы сообщений)
#define LOG_NONE     0
#define LOG_FATAL    1
#define LOG_ERROR    2
#define LOG_WARNING  3
#define LOG_NOTICE   4
#define LOG_INFO     5

//Уровень фильтрации сообщений лога
#ifndef LOG_LEVEL
  #define LOG_LEVEL (LOG_NONE)
#endif

class Logger {
  private:
  public:
    Logger(void);
    static void AddMess(int Level, const char *mess, ...);
    static void AddStr(const char *mess, ...);
};

//Добавить Info сообщение в лог
#define LogInfo(...)                                        \
if (LOG_LEVEL >= LOG_INFO) {                                \
  Logger::AddMess(LOG_INFO, __VA_ARGS__);                   \
}                                                           \

//Добавить Notice сообщение в лог
#define LogNotice(...)                                      \
if (LOG_LEVEL >= LOG_NOTICE) {                              \
  Logger::AddMess(LOG_NOTICE, __VA_ARGS__);                 \
}                                                           \

//Добавить Warning сообщение в лог
#define LogWarning(...)                                     \
if (LOG_LEVEL >= LOG_WARNING) {                             \
  Logger::AddMess(LOG_WARNING, __VA_ARGS__);                \
}                                                           \

//Добавить Error сообщение в лог
#define LogError(...)                                       \
if (LOG_LEVEL >= LOG_ERROR) {                               \
  Logger::AddMess(LOG_ERROR, __VA_ARGS__);                  \
}                                                           \

//Добавить Fatal сообщение в лог
#define LogFatal(...)                                       \
if (LOG_LEVEL >= LOG_FATAL) {                               \
  Logger::AddMess(LOG_FATAL, __VA_ARGS__);                  \
}                                                           \

//Добавить строку в лог
#define LogStr(...)                                         \
if (LOG_LEVEL >= LOG_FATAL) {                               \
  Logger::AddStr(__VA_ARGS__);                              \
}                                                           \

#endif //LOG_H


Log.cpp
Код
#include "Log.h"
#include <cstdarg>

//Имена типов сообщений
const char LevelNames[6][8] = {
  "",
  "Fatal",
  "Error",
  "Warning",
  "Notice",
  "Info"
};

//-----------------------------------------------------------------------------
// Logger
//-----------------------------------------------------------------------------
//Конструктор
Logger::Logger(void)
{
}

//Добавить строку в лог
//mess:
//  Сообщение
//...:
//  Дополнительные аргументы в стиле printf
void Logger::AddStr(const char *mess, ...)
{
  #if (LOG_LEVEL > 0)
    va_list args;

    va_start(args, mess);
    vprintf(mess, args);
    va_end(args);
    printf("\n");
  #endif
}

//Добавление сообщения в лог
//Level:
//  Тип сообщения
//mess:
//  Сообщение
//...:
//  Дополнительные аргументы в стиле printf
void Logger::AddMess(int Level, const char *mess, ...)
{
  #if (LOG_LEVEL > 0)
    va_list args;

    //тут можно добавить вывод строки дата/время
    //...
    //Тип сообщения
    if ((Level > LOG_NONE) && (Level <= LOG_INFO)) {
      printf(" %s: ", LevelNames[Level]);
    }
    //Сообщение
    va_start(args, mess);
    vprintf(mess, args);
    va_end(args);
    printf("\n");
  #endif
}


Config.h
Код
#ifndef CONFIG_H
#define CONFIG_H

//Уровень лога отлади 0..5
#define LOG_LEVEL 4

#endif //CONFIG_H
Go to the top of the page
 
+Quote Post
Sergius
сообщение Mar 11 2009, 11:11
Сообщение #2





Группа: Новичок
Сообщений: 9
Регистрация: 7-12-04
Из: Киев
Пользователь №: 1 390



Идея хорошая. Пишу логи в формате csv и пользуюсь макросами __FUNCTION__ и __LINE__ - очень удобно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 05:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016