color logger

写了个简单的 logger,方便调试。


#ifndef OAM_PTP_LOGGER_H_
#define OAM_PTP_LOGGER_H_

namespace log
{

enum LogLevel {
  kDebug,
  kInfo,
  kWarn,
  kError,
  kFatal
};

class Logger {
 public:
  Logger() { }
  virtual void Write(LogLevel level, const char* format, ...) = 0;
  virtual ~Logger() { }

 private:
  Logger(const Logger& logger);
  void operator=(const Logger& logger);
};

/**
 * @brief Do nothing.
 */
class DummyLogger : public Logger {
 public:
  virtual void Write(LogLevel level, const char* format, ...) {
    (void)level;
    (void)format;
  }

};

}

#endif /* end of include guard: OAM_PTP_LOGGER_H_ */


namespace log
{

class ColorLogger : public ptp::log::Logger {
 public:
  virtual void Write(ptp::log::LogLevel level, const char* format, ...) {

    time_t now = time(NULL);
    struct tm *ptm = localtime(&now);
    char buf[64] = {0};
    snprintf(buf, sizeof(buf), "[%02d-%02d-%02d %02d:%02d:%02d]",
             (ptm->tm_year + 1900) / 100,
             ptm->tm_mon + 1,
             ptm->tm_mday,
             ptm->tm_hour,
             ptm->tm_min,
             ptm->tm_sec);

    switch(level) {
      case ptp::log::kDebug: this->Debug(buf, format); break;
      case ptp::log::kInfo:  this->Info(buf, format);  break;
      case ptp::log::kWarn:  this->Warn(buf, format);  break;
      case ptp::log::kError: this->Error(buf, format); break;
      case ptp::log::kFatal: this->Fatal(buf, format); break;
    };


    va_list args;
    va_start(args, format);
    vprintf(this->buffer_, args);
    va_end(args);

  }

 private:

  void Debug(const char *time, const char *format) {
    sprintf(this->buffer_,
            "