HEX 0 9 февраля, 2009 Опубликовано 9 февраля, 2009 · Жалоба Может кому пригодиться. Сама идея описана здесь, вот еще статья на эту тему, спасибо авторам. 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergius 0 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба Идея хорошая. Пишу логи в формате csv и пользуюсь макросами __FUNCTION__ и __LINE__ - очень удобно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться