log.h 4.2 KB
Newer Older
L
liuruilong 已提交
1 2
#pragma once

L
liuruilong 已提交
3
#include <vector>
L
liuruilong 已提交
4 5 6 7
#ifdef PADDLE_MOBILE_DEBUG
#include <iostream>
#include <sstream>
#include <string>
L
liuruilong 已提交
8
#endif
L
liuruilong 已提交
9 10 11

namespace paddle_mobile {

L
liuruilong 已提交
12 13
#ifdef PADDLE_MOBILE_DEBUG

朔-望's avatar
朔-望 已提交
14
enum LogLevel {
15 16 17 18 19 20 21 22 23
  kNO_LOG,
  kLOG_ERROR,
  kLOG_WARNING,
  kLOG_INFO,
  kLOG_DEBUG,
  kLOG_DEBUG1,
  kLOG_DEBUG2,
  kLOG_DEBUG3,
  kLOG_DEBUG4
朔-望's avatar
朔-望 已提交
24 25 26 27 28 29 30 31 32 33 34 35
};

// log level
static LogLevel log_level = kLOG_DEBUG4;

static std::vector<std::string> logs{"NO",      "ERROR ",  "WARNING",
                                     "INFO   ", "DEBUG  ", "DEBUG1 ",
                                     "DEBUG2 ", "DEBUG3 ", "DEBUG4 "};
struct ToLog;
struct Print;

struct Print {
36 37
  friend struct ToLog;

朔-望's avatar
朔-望 已提交
38 39
  template <typename T>
  Print &operator<<(T const &value) {
40 41 42 43
    buffer_ << value;
    return *this;
  }

朔-望's avatar
朔-望 已提交
44
 private:
45 46 47 48 49 50
  void print(LogLevel level) {
    buffer_ << std::endl;
    if (level == kLOG_ERROR) {
      std::cerr << buffer_.str();
    } else {
      std::cout << buffer_.str();
朔-望's avatar
朔-望 已提交
51
    }
52 53
  }
  std::ostringstream buffer_;
朔-望's avatar
朔-望 已提交
54 55 56
};

struct ToLog {
57 58 59 60 61 62 63
  ToLog(LogLevel level = kLOG_DEBUG, const std::string &info = "")
      : level_(level) {
    unsigned blanks =
        (unsigned)(level > kLOG_DEBUG ? (level - kLOG_DEBUG) * 4 : 1);
    printer_ << logs[level] << " " << info << ":" << std::string(blanks, ' ');
  }

朔-望's avatar
朔-望 已提交
64 65
  template <typename T>
  ToLog &operator<<(T const &value) {
66 67 68 69 70 71
    printer_ << value;
    return *this;
  }

  ~ToLog() { printer_.print(level_); }

朔-望's avatar
朔-望 已提交
72
 private:
73 74
  LogLevel level_;
  Print printer_;
朔-望's avatar
朔-望 已提交
75
};
L
liuruilong 已提交
76 77

#define LOG(level)                                                             \
78 79 80 81 82 83 84 85 86
  if (level > paddle_mobile::log_level) {                                      \
  } else                                                                       \
    paddle_mobile::ToLog(                                                      \
        level,                                                                 \
        (std::stringstream()                                                   \
         << "[file: "                                                          \
         << (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1) : __FILE__) \
         << "] [line: " << __LINE__ << "] ")                                   \
            .str())
L
liuruilong 已提交
87 88

#define DLOG                                                                   \
89 90 91 92 93 94 95 96 97
  if (paddle_mobile::kLOG_DEBUG > paddle_mobile::log_level) {                  \
  } else                                                                       \
    paddle_mobile::ToLog(                                                      \
        paddle_mobile::kLOG_DEBUG,                                             \
        (std::stringstream()                                                   \
         << "[file: "                                                          \
         << (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1) : __FILE__) \
         << "] [line: " << __LINE__ << "] ")                                   \
            .str())
L
liuruilong 已提交
98

朔-望's avatar
朔-望 已提交
99 100 101
#define LOGF(level, format, ...)          \
  if (level > paddle_mobile::log_level) { \
  } else                                  \
102
    printf(format, ##__VA_ARGS__)
L
liuruilong 已提交
103

朔-望's avatar
朔-望 已提交
104 105 106
#define DLOGF(format, ...)                                    \
  if (paddle_mobile::kLOG_DEBUG > paddle_mobile::log_level) { \
  } else                                                      \
107
    printf(format, ##__VA_ARGS__)
L
liuruilong 已提交
108

L
liuruilong 已提交
109 110
#else

朔-望's avatar
朔-望 已提交
111
enum LogLevel {
112 113 114 115 116 117 118 119 120
  kNO_LOG,
  kLOG_ERROR,
  kLOG_WARNING,
  kLOG_INFO,
  kLOG_DEBUG,
  kLOG_DEBUG1,
  kLOG_DEBUG2,
  kLOG_DEBUG3,
  kLOG_DEBUG4
朔-望's avatar
朔-望 已提交
121 122 123 124
};

struct ToLog;
struct Print {
125
  friend struct ToLog;
朔-望's avatar
朔-望 已提交
126 127
  template <typename T>
  Print &operator<<(T const &value) {}
朔-望's avatar
朔-望 已提交
128

朔-望's avatar
朔-望 已提交
129
 private:
朔-望's avatar
朔-望 已提交
130 131 132
};

struct ToLog {
133
  ToLog(LogLevel level) {}
朔-望's avatar
朔-望 已提交
134

朔-望's avatar
朔-望 已提交
135 136 137 138
  template <typename T>
  ToLog &operator<<(T const &value) {
    return *this;
  }
朔-望's avatar
朔-望 已提交
139
};
L
liuruilong 已提交
140

朔-望's avatar
朔-望 已提交
141 142 143
#define LOG(level) \
  if (true) {      \
  } else           \
144
    paddle_mobile::ToLog(level)
L
liuruilong 已提交
145

朔-望's avatar
朔-望 已提交
146 147 148
#define DLOG  \
  if (true) { \
  } else      \
149
    paddle_mobile::ToLog(paddle_mobile::kLOG_DEBUG)
L
liuruilong 已提交
150 151 152 153 154

#define LOGF(level, format, ...)

#define DLOGF(format, ...)

L
liuruilong 已提交
155
#endif
L
liuruilong 已提交
156 157 158 159 160 161 162 163 164 165 166 167

template <typename T>
Print &operator<<(Print &printer, const std::vector<T> &v) {
  printer << "[ ";
  for (const auto &value : v) {
    printer << value << " ";
  }
  printer << " ]";
  return printer;
}

}  // namespace paddle_mobile