среда, 21 августа 2013 г.

logger levels

logger levels
/** Добавим уровни логов в наш класс 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;

struct logger

asd
 
/** Привет, поделюсь простым способом ведения логов. Некоторые думают, что добавить логи в программу очень сложно и пишут простые классы на 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 уже дружен со многими стандартными классами. Так же он легко используем и расширяем. Это я покажу в следующем посте. */