Может кому пригодиться.
Сама идея описана
здесь,
вот еще статья на эту тему, спасибо авторам.
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