log.h 5.6 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#ifdef ANDROID

extern const char *ANDROID_LOG_TAG;

#define LOGI(...)                                                      \
  __android_log_print(ANDROID_LOG_INFO, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)
#define LOGW(...)                                                         \
  __android_log_print(ANDROID_LOG_WARNING, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)
#define LOGD(...)                                                       \
  __android_log_print(ANDROID_LOG_DEBUG, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)
#define LOGE(...)                                                       \
  __android_log_print(ANDROID_LOG_ERROR, ANDROID_LOG_TAG, __VA_ARGS__); \
  printf(__VA_ARGS__)

#endif

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

// 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 {
72 73
  friend struct ToLog;

朔-望's avatar
朔-望 已提交
74 75
  template <typename T>
  Print &operator<<(T const &value) {
76 77 78 79
    buffer_ << value;
    return *this;
  }

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

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

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

朔-望's avatar
朔-望 已提交
108
 private:
109 110
  LogLevel level_;
  Print printer_;
朔-望's avatar
朔-望 已提交
111
};
L
liuruilong 已提交
112 113

#define LOG(level)                                                             \
114 115 116 117 118 119 120 121 122
  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 已提交
123 124

#define DLOG                                                                   \
125 126 127 128 129 130 131 132 133
  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 已提交
134

朔-望's avatar
朔-望 已提交
135 136 137
#define LOGF(level, format, ...)          \
  if (level > paddle_mobile::log_level) { \
  } else                                  \
138
    printf(format, ##__VA_ARGS__)
L
liuruilong 已提交
139

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

L
liuruilong 已提交
145 146
#else

朔-望's avatar
朔-望 已提交
147
enum LogLevel {
148 149 150 151 152 153 154 155 156
  kNO_LOG,
  kLOG_ERROR,
  kLOG_WARNING,
  kLOG_INFO,
  kLOG_DEBUG,
  kLOG_DEBUG1,
  kLOG_DEBUG2,
  kLOG_DEBUG3,
  kLOG_DEBUG4
朔-望's avatar
朔-望 已提交
157 158 159 160
};

struct ToLog;
struct Print {
161
  friend struct ToLog;
朔-望's avatar
朔-望 已提交
162 163
  template <typename T>
  Print &operator<<(T const &value) {}
朔-望's avatar
朔-望 已提交
164

朔-望's avatar
朔-望 已提交
165
 private:
朔-望's avatar
朔-望 已提交
166 167 168
};

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

朔-望's avatar
朔-望 已提交
171 172 173 174
  template <typename T>
  ToLog &operator<<(T const &value) {
    return *this;
  }
朔-望's avatar
朔-望 已提交
175
};
L
liuruilong 已提交
176

朔-望's avatar
朔-望 已提交
177 178 179
#define LOG(level) \
  if (true) {      \
  } else           \
180
    paddle_mobile::ToLog(level)
L
liuruilong 已提交
181

朔-望's avatar
朔-望 已提交
182 183 184
#define DLOG  \
  if (true) { \
  } else      \
185
    paddle_mobile::ToLog(paddle_mobile::kLOG_DEBUG)
L
liuruilong 已提交
186 187 188 189 190

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

#define DLOGF(format, ...)

L
liuruilong 已提交
191
#endif
L
liuruilong 已提交
192 193 194

template <typename T>
Print &operator<<(Print &printer, const std::vector<T> &v) {
L
liuruilong 已提交
195
  printer << "[ ";
L
liuruilong 已提交
196 197 198

  for (int i = 0; i < v.size(); ++i) {
    const auto &value = v[i];
L
liuruilong 已提交
199
    printer << value << " ";
L
liuruilong 已提交
200 201 202
    if (i % 10 == 9) {
      printer << "\n";
    }
L
liuruilong 已提交
203
  }
L
liuruilong 已提交
204
  printer << " ]";
L
liuruilong 已提交
205 206 207
  return printer;
}

L
liuruilong 已提交
208
}  // namespace paddle_mobile