log.h 5.9 KB
Newer Older
L
liuruilong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

L
liuruilong 已提交
15 16
#pragma once

L
liuruilong 已提交
17
#include <vector>
L
liuruilong 已提交
18 19 20 21
#ifdef PADDLE_MOBILE_DEBUG
#include <iostream>
#include <sstream>
#include <string>
L
liuruilong 已提交
22
#endif
W
wangliu 已提交
23 24 25
#ifdef ANDROID
#include <android/log.h>
#endif
L
liuruilong 已提交
26 27 28

namespace paddle_mobile {

L
liuruilong 已提交
29 30
#ifdef PADDLE_MOBILE_DEBUG

W
wangliu 已提交
31 32 33 34
#ifdef ANDROID

extern const char *ANDROID_LOG_TAG;

W
wangliu 已提交
35
#define ANDROIDLOGI(...)                                                      \
W
wangliu 已提交
36 37
  __android_log_print(ANDROID_LOG_INFO, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)
W
wangliu 已提交
38
#define ANDROIDLOGW(...)                                                         \
W
wangliu 已提交
39 40
  __android_log_print(ANDROID_LOG_WARNING, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)
W
wangliu 已提交
41
#define ANDROIDLOGD(...)                                                       \
W
wangliu 已提交
42 43
  __android_log_print(ANDROID_LOG_DEBUG, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)
W
wangliu 已提交
44
#define ANDROIDLOGE(...)                                                       \
W
wangliu 已提交
45 46
  __android_log_print(ANDROID_LOG_ERROR, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)
W
wangliu 已提交
47 48 49 50 51
#else
#define ANDROIDLOGI(...)
#define ANDROIDLOGW(...)
#define ANDROIDLOGD(...)
#define ANDROIDLOGE(...)
W
wangliu 已提交
52 53 54

#endif

朔-望's avatar
朔-望 已提交
55
enum LogLevel {
56 57 58 59 60 61 62 63 64
  kNO_LOG,
  kLOG_ERROR,
  kLOG_WARNING,
  kLOG_INFO,
  kLOG_DEBUG,
  kLOG_DEBUG1,
  kLOG_DEBUG2,
  kLOG_DEBUG3,
  kLOG_DEBUG4
朔-望's avatar
朔-望 已提交
65 66 67 68 69 70 71 72 73 74 75 76
};

// 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 {
77 78
  friend struct ToLog;

朔-望's avatar
朔-望 已提交
79 80
  template <typename T>
  Print &operator<<(T const &value) {
81 82 83 84
    buffer_ << value;
    return *this;
  }

朔-望's avatar
朔-望 已提交
85
 private:
86 87 88 89 90 91
  void print(LogLevel level) {
    buffer_ << std::endl;
    if (level == kLOG_ERROR) {
      std::cerr << buffer_.str();
    } else {
      std::cout << buffer_.str();
朔-望's avatar
朔-望 已提交
92
    }
93 94
  }
  std::ostringstream buffer_;
朔-望's avatar
朔-望 已提交
95 96 97
};

struct ToLog {
98 99 100 101 102 103 104
  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
朔-望 已提交
105 106
  template <typename T>
  ToLog &operator<<(T const &value) {
107 108 109 110 111 112
    printer_ << value;
    return *this;
  }

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

朔-望's avatar
朔-望 已提交
113
 private:
114 115
  LogLevel level_;
  Print printer_;
朔-望's avatar
朔-望 已提交
116
};
L
liuruilong 已提交
117 118

#define LOG(level)                                                             \
119 120 121 122 123 124 125 126 127
  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 已提交
128 129

#define DLOG                                                                   \
130 131 132 133 134 135 136 137 138
  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 已提交
139

朔-望's avatar
朔-望 已提交
140 141 142
#define LOGF(level, format, ...)          \
  if (level > paddle_mobile::log_level) { \
  } else                                  \
143
    printf(format, ##__VA_ARGS__)
L
liuruilong 已提交
144

朔-望's avatar
朔-望 已提交
145 146 147
#define DLOGF(format, ...)                                    \
  if (paddle_mobile::kLOG_DEBUG > paddle_mobile::log_level) { \
  } else                                                      \
148
    printf(format, ##__VA_ARGS__)
L
liuruilong 已提交
149

L
liuruilong 已提交
150 151
#else

W
wangliu 已提交
152 153 154 155 156
#define ANDROIDLOGI(...)
#define ANDROIDLOGW(...)
#define ANDROIDLOGD(...)
#define ANDROIDLOGE(...)

朔-望's avatar
朔-望 已提交
157
enum LogLevel {
158 159 160 161 162 163 164 165 166
  kNO_LOG,
  kLOG_ERROR,
  kLOG_WARNING,
  kLOG_INFO,
  kLOG_DEBUG,
  kLOG_DEBUG1,
  kLOG_DEBUG2,
  kLOG_DEBUG3,
  kLOG_DEBUG4
朔-望's avatar
朔-望 已提交
167 168 169 170
};

struct ToLog;
struct Print {
171
  friend struct ToLog;
朔-望's avatar
朔-望 已提交
172 173
  template <typename T>
  Print &operator<<(T const &value) {}
朔-望's avatar
朔-望 已提交
174

朔-望's avatar
朔-望 已提交
175
 private:
朔-望's avatar
朔-望 已提交
176 177 178
};

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

朔-望's avatar
朔-望 已提交
181 182 183 184
  template <typename T>
  ToLog &operator<<(T const &value) {
    return *this;
  }
朔-望's avatar
朔-望 已提交
185
};
L
liuruilong 已提交
186

朔-望's avatar
朔-望 已提交
187 188 189
#define LOG(level) \
  if (true) {      \
  } else           \
190
    paddle_mobile::ToLog(level)
L
liuruilong 已提交
191

朔-望's avatar
朔-望 已提交
192 193 194
#define DLOG  \
  if (true) { \
  } else      \
195
    paddle_mobile::ToLog(paddle_mobile::kLOG_DEBUG)
L
liuruilong 已提交
196 197 198 199 200

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

#define DLOGF(format, ...)

L
liuruilong 已提交
201
#endif
L
liuruilong 已提交
202 203 204

template <typename T>
Print &operator<<(Print &printer, const std::vector<T> &v) {
L
liuruilong 已提交
205
  printer << "[ ";
L
liuruilong 已提交
206 207 208

  for (int i = 0; i < v.size(); ++i) {
    const auto &value = v[i];
L
liuruilong 已提交
209
    printer << value << " ";
L
liuruilong 已提交
210 211 212
    if (i % 10 == 9) {
      printer << "\n";
    }
L
liuruilong 已提交
213
  }
L
liuruilong 已提交
214
  printer << " ]";
L
liuruilong 已提交
215 216 217
  return printer;
}

L
liuruilong 已提交
218
}  // namespace paddle_mobile