Перейти к содержанию
    

реализация логера

Может кому пригодиться.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Идея хорошая. Пишу логи в формате csv и пользуюсь макросами __FUNCTION__ и __LINE__ - очень удобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...