/** Добавим уровни логов в наш класс logger из предыдущего поста. */ enum level_t { level_error, level_debug, }; /** уровень лога по умолчанию */ level_t log_level = level_error; /** макросы? фууу! нет времени объяснять, объясню позже зачем */ #define LOG_LEVEL(LEVEL) if (LEVEL <= log_level) LOG #define LOG_ERROR LOG_LEVEL(level_error) << "ERROR: " #define LOG_DEBUG LOG_LEVEL(level_debug) << "DEBUG: " /** Использование: первая строчка выведется, а вторая нет, потому что уровень лога: level_error */ LOG_ERROR << "Hello, world! " << 1; LOG_DEBUG << "Hello, world! " << 2;
среда, 21 августа 2013 г.
logger levels
struct logger
/** Привет, поделюсь простым способом ведения логов. Некоторые думают, что добавить логи в программу очень сложно и пишут простые классы на 1000 строк. Вот простой способ. */ template <typename Out> struct logger { logger(Out& out): m_out(out) { m_out << "LOG: "; } ~logger() { m_out << "\n"; } Out& get() { return m_out; } private: Out& m_out; }; /** Главное, чтобы Out умел операцию "<<"; Таким образом, мы можем подсунуть хоть std::fstream, хоть std::cout. Использование: */ #include <iostream> #define LOG logger<std::ostream>(std::cout).get() LOG << "Hello, world! " << 1; LOG << "Hello, world! " << 2; /** Класс logger уже дружен со многими стандартными классами. Так же он легко используем и расширяем. Это я покажу в следующем посте. */
Подписаться на:
Сообщения (Atom)