Home | History | Annotate | Download | only in glog
      1 // Ceres Solver - A fast non-linear least squares minimizer
      2 // Copyright 2011, 2012 Google Inc. All rights reserved.
      3 // http://code.google.com/p/ceres-solver/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are met:
      7 //
      8 // * Redistributions of source code must retain the above copyright notice,
      9 //   this list of conditions and the following disclaimer.
     10 // * Redistributions in binary form must reproduce the above copyright notice,
     11 //   this list of conditions and the following disclaimer in the documentation
     12 //   and/or other materials provided with the distribution.
     13 // * Neither the name of Google Inc. nor the names of its contributors may be
     14 //   used to endorse or promote products derived from this software without
     15 //   specific prior written permission.
     16 //
     17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     27 // POSSIBILITY OF SUCH DAMAGE.
     28 //
     29 // Author: settinger (at) google.com (Scott Ettinger)
     30 //         keir (at) google.com (Keir Mierle)
     31 //
     32 // Simplified Glog style logging with Android support. Supported macros in
     33 // decreasing severity level per line:
     34 //
     35 //   VLOG(2), VLOG(N)
     36 //   VLOG(1),
     37 //   LOG(INFO), VLOG(0), LG
     38 //   LOG(WARNING),
     39 //   LOG(ERROR),
     40 //   LOG(FATAL),
     41 //
     42 // With VLOG(n), the output is directed to one of the 5 Android log levels:
     43 //
     44 //   2 - Verbose
     45 //   1 - Debug
     46 //   0 - Info
     47 //  -1 - Warning
     48 //  -2 - Error
     49 //  -3 - Fatal
     50 //
     51 // Any logging of level 2 and above is directed to the Verbose level. All
     52 // Android log output is tagged with the string "native".
     53 //
     54 // If the symbol ANDROID is not defined, all output goes to std::cerr.
     55 // This allows code to be built on a different system for debug.
     56 //
     57 // Portions of this code are taken from the GLOG package.  This code is only a
     58 // small subset of the GLOG functionality. Notable differences from GLOG
     59 // behavior include lack of support for displaying unprintable characters and
     60 // lack of stack trace information upon failure of the CHECK macros.  On
     61 // non-Android systems, log output goes to std::cerr and is not written to a
     62 // file.
     63 //
     64 // CHECK macros are defined to test for conditions within code.  Any CHECK that
     65 // fails will log the failure and terminate the application.
     66 // e.g. CHECK_GE(3, 2) will pass while CHECK_GE(3, 4) will fail after logging
     67 //      "Check failed 3 >= 4".
     68 //
     69 // The following CHECK macros are defined:
     70 //
     71 //   CHECK(condition)        - fails if condition is false and logs condition.
     72 //   CHECK_NOTNULL(variable) - fails if the variable is NULL.
     73 //
     74 // The following binary check macros are also defined :
     75 //
     76 //   Macro                     Operator equivalent
     77 //   --------------------      -------------------
     78 //   CHECK_EQ(val1, val2)      val1 == val2
     79 //   CHECK_NE(val1, val2)      val1 != val2
     80 //   CHECK_GT(val1, val2)      val1 > val2
     81 //   CHECK_GE(val1, val2)      val1 >= val2
     82 //   CHECK_LT(val1, val2)      val1 < val2
     83 //   CHECK_LE(val1, val2)      val1 <= val2
     84 //
     85 // Debug only versions of all of the check macros are also defined.  These
     86 // macros generate no code in a release build, but avoid unused variable
     87 // warnings / errors.
     88 //
     89 // To use the debug only versions, prepend a D to the normal check macros, e.g.
     90 // DCHECK_EQ(a, b).
     91 
     92 #ifndef CERCES_INTERNAL_MINIGLOG_GLOG_LOGGING_H_
     93 #define CERCES_INTERNAL_MINIGLOG_GLOG_LOGGING_H_
     94 
     95 #ifdef ANDROID
     96 #include <android/log.h>
     97 #endif  // ANDROID
     98 
     99 #include <algorithm>
    100 #include <iostream>
    101 #include <string>
    102 #include <fstream>
    103 #include <set>
    104 #include <sstream>
    105 #include <vector>
    106 
    107 // Log severity level constants.
    108 const int FATAL   = -3;
    109 const int ERROR   = -2;
    110 const int WARNING = -1;
    111 const int INFO    =  0;
    112 
    113 // ------------------------- Glog compatibility ------------------------------
    114 
    115 namespace google {
    116 
    117 typedef int LogSeverity;
    118 const int INFO    = ::INFO;
    119 const int WARNING = ::WARNING;
    120 const int ERROR   = ::ERROR;
    121 const int FATAL   = ::FATAL;
    122 
    123 // Sink class used for integration with mock and test functions. If sinks are
    124 // added, all log output is also sent to each sink through the send function.
    125 // In this implementation, WaitTillSent() is called immediately after the send.
    126 // This implementation is not thread safe.
    127 class LogSink {
    128  public:
    129   virtual ~LogSink() {}
    130   virtual void send(LogSeverity severity,
    131                     const char* full_filename,
    132                     const char* base_filename,
    133                     int line,
    134                     const struct tm* tm_time,
    135                     const char* message,
    136                     size_t message_len) = 0;
    137   virtual void WaitTillSent() = 0;
    138 };
    139 
    140 // Global set of log sinks. The actual object is defined in logging.cc.
    141 extern std::set<LogSink *> log_sinks_global;
    142 
    143 inline void InitGoogleLogging(char *argv) {
    144   // Do nothing; this is ignored.
    145 }
    146 
    147 // Note: the Log sink functions are not thread safe.
    148 inline void AddLogSink(LogSink *sink) {
    149   // TODO(settinger): Add locks for thread safety.
    150   log_sinks_global.insert(sink);
    151 }
    152 inline void RemoveLogSink(LogSink *sink) {
    153   log_sinks_global.erase(sink);
    154 }
    155 
    156 }  // namespace google
    157 
    158 // ---------------------------- Logger Class --------------------------------
    159 
    160 // Class created for each use of the logging macros.
    161 // The logger acts as a stream and routes the final stream contents to the
    162 // Android logcat output at the proper filter level.  If ANDROID is not
    163 // defined, output is directed to std::cerr.  This class should not
    164 // be directly instantiated in code, rather it should be invoked through the
    165 // use of the log macros LG, LOG, or VLOG.
    166 class MessageLogger {
    167  public:
    168   MessageLogger(const char *file, int line, const char *tag, int severity)
    169     : file_(file), line_(line), tag_(tag), severity_(severity) {
    170     // Pre-pend the stream with the file and line number.
    171     StripBasename(std::string(file), &filename_only_);
    172     stream_ << filename_only_ << ":" << line << " ";
    173   }
    174 
    175   // Output the contents of the stream to the proper channel on destruction.
    176   ~MessageLogger() {
    177     stream_ << "\n";
    178 
    179 #ifdef ANDROID
    180     static const int android_log_levels[] = {
    181         ANDROID_LOG_FATAL,    // LOG(FATAL)
    182         ANDROID_LOG_ERROR,    // LOG(ERROR)
    183         ANDROID_LOG_WARN,     // LOG(WARNING)
    184         ANDROID_LOG_INFO,     // LOG(INFO), LG, VLOG(0)
    185         ANDROID_LOG_DEBUG,    // VLOG(1)
    186         ANDROID_LOG_VERBOSE,  // VLOG(2) .. VLOG(N)
    187     };
    188 
    189     // Bound the logging level.
    190     const int kMaxVerboseLevel = 2;
    191     int android_level_index = std::min(std::max(FATAL, severity_),
    192                                        kMaxVerboseLevel) - FATAL;
    193     int android_log_level = android_log_levels[android_level_index];
    194 
    195     // Output the log string the Android log at the appropriate level.
    196     __android_log_print(android_log_level, tag_.c_str(), stream_.str().c_str());
    197 
    198     // Indicate termination if needed.
    199     if (severity_ == FATAL) {
    200       __android_log_print(ANDROID_LOG_FATAL,
    201                           tag_.c_str(),
    202                           "terminating.\n");
    203     }
    204 #else
    205     // If not building on Android, log all output to std::cerr.
    206     std::cerr << stream_.str();
    207 #endif  // ANDROID
    208 
    209     LogToSinks(severity_);
    210     WaitForSinks();
    211 
    212     // Android logging at level FATAL does not terminate execution, so abort()
    213     // is still required to stop the program.
    214     if (severity_ == FATAL) {
    215       abort();
    216     }
    217   }
    218 
    219   // Return the stream associated with the logger object.
    220   std::stringstream &stream() { return stream_; }
    221 
    222  private:
    223   void LogToSinks(int severity) {
    224     time_t rawtime;
    225     struct tm* timeinfo;
    226 
    227     time (&rawtime);
    228     timeinfo = localtime(&rawtime);
    229     std::set<google::LogSink*>::iterator iter;
    230     // Send the log message to all sinks.
    231     for (iter = google::log_sinks_global.begin();
    232          iter != google::log_sinks_global.end(); ++iter) {
    233       (*iter)->send(severity, file_.c_str(), filename_only_.c_str(), line_,
    234                     timeinfo, stream_.str().c_str(), stream_.str().size());
    235     }
    236   }
    237 
    238   void WaitForSinks() {
    239     // TODO(settinger): Add locks for thread safety.
    240     std::set<google::LogSink *>::iterator iter;
    241 
    242     // Call WaitTillSent() for all sinks.
    243     for (iter = google::log_sinks_global.begin();
    244          iter != google::log_sinks_global.end(); ++iter) {
    245       (*iter)->WaitTillSent();
    246     }
    247   }
    248 
    249   void StripBasename(const std::string &full_path, std::string *filename) {
    250     // TODO(settinger): add support for OS with different path separators.
    251     const char kSeparator = '/';
    252     size_t pos = full_path.rfind(kSeparator);
    253     if (pos != std::string::npos) {
    254       *filename = full_path.substr(pos + 1, std::string::npos);
    255     } else {
    256       *filename = full_path;
    257     }
    258   }
    259 
    260   std::string file_;
    261   std::string filename_only_;
    262   int line_;
    263   std::string tag_;
    264   std::stringstream stream_;
    265   int severity_;
    266 };
    267 
    268 // ---------------------- Logging Macro definitions --------------------------
    269 
    270 #define LG MessageLogger((char *)__FILE__, __LINE__, "native", \
    271                          INFO).stream()
    272 
    273 #define LOG(n) MessageLogger((char *)__FILE__, __LINE__, "native", \
    274                              n).stream()
    275 
    276 #define VLOG(n) MessageLogger((char *)__FILE__, __LINE__, "native", \
    277                               n).stream()
    278 
    279 // Currently, VLOG is always on.
    280 #define VLOG_IS_ON(x) true
    281 
    282 // ---------------------------- CHECK helpers --------------------------------
    283 
    284 // This class is used to explicitly ignore values in the conditional
    285 // logging macros.  This avoids compiler warnings like "value computed
    286 // is not used" and "statement has no effect".
    287 class LoggerVoidify {
    288  public:
    289   LoggerVoidify() { }
    290   // This has to be an operator with a precedence lower than << but
    291   // higher than ?:
    292   void operator&(const std::ostream &s) { }
    293 };
    294 
    295 // Log only if condition is met.  Otherwise evaluates to void.
    296 #define LOG_IF(severity, condition) \
    297   condition ? (void) 0 : LoggerVoidify() & LOG(severity)
    298 
    299 // Log a message and terminate.
    300 template<class T>
    301 void LogMessageFatal(const char *file, int line, const T &message) {
    302   MessageLogger((char *)__FILE__, __LINE__, "native", FATAL).stream()
    303       << message;
    304 }
    305 
    306 // ---------------------------- CHECK macros ---------------------------------
    307 
    308 // Check for a given boolean condition.
    309 #define CHECK(condition) LOG_IF(FATAL, condition) \
    310         << "Check failed: " #condition " "
    311 
    312 #ifndef NDEBUG
    313 // Debug only version of CHECK
    314 #define DCHECK(condition) LOG_IF(FATAL, condition) \
    315         << "Check failed: " #condition " "
    316 #else
    317 // Optimized version - generates no code.
    318 #define DCHECK(condition) if (false) LOG_IF(FATAL, condition) \
    319         << "Check failed: " #condition " "
    320 #endif  // NDEBUG
    321 
    322 // ------------------------- CHECK_OP macros ---------------------------------
    323 
    324 // Generic binary operator check macro. This should not be directly invoked,
    325 // instead use the binary comparison macros defined below.
    326 #define CHECK_OP(val1, val2, op) LOG_IF(FATAL, (val1 op val2)) \
    327   << "Check failed: " #val1 " " #op " " #val2 " "
    328 
    329 // Check_op macro definitions
    330 #define CHECK_EQ(val1, val2) CHECK_OP(val1, val2, ==)
    331 #define CHECK_NE(val1, val2) CHECK_OP(val1, val2, !=)
    332 #define CHECK_LE(val1, val2) CHECK_OP(val1, val2, <=)
    333 #define CHECK_LT(val1, val2) CHECK_OP(val1, val2, <)
    334 #define CHECK_GE(val1, val2) CHECK_OP(val1, val2, >=)
    335 #define CHECK_GT(val1, val2) CHECK_OP(val1, val2, >)
    336 
    337 #ifndef NDEBUG
    338 // Debug only versions of CHECK_OP macros.
    339 #define DCHECK_EQ(val1, val2) CHECK_OP(val1, val2, ==)
    340 #define DCHECK_NE(val1, val2) CHECK_OP(val1, val2, !=)
    341 #define DCHECK_LE(val1, val2) CHECK_OP(val1, val2, <=)
    342 #define DCHECK_LT(val1, val2) CHECK_OP(val1, val2, <)
    343 #define DCHECK_GE(val1, val2) CHECK_OP(val1, val2, >=)
    344 #define DCHECK_GT(val1, val2) CHECK_OP(val1, val2, >)
    345 #else
    346 // These versions generate no code in optimized mode.
    347 #define DCHECK_EQ(val1, val2) if (false) CHECK_OP(val1, val2, ==)
    348 #define DCHECK_NE(val1, val2) if (false) CHECK_OP(val1, val2, !=)
    349 #define DCHECK_LE(val1, val2) if (false) CHECK_OP(val1, val2, <=)
    350 #define DCHECK_LT(val1, val2) if (false) CHECK_OP(val1, val2, <)
    351 #define DCHECK_GE(val1, val2) if (false) CHECK_OP(val1, val2, >=)
    352 #define DCHECK_GT(val1, val2) if (false) CHECK_OP(val1, val2, >)
    353 #endif  // NDEBUG
    354 
    355 // ---------------------------CHECK_NOTNULL macros ---------------------------
    356 
    357 // Helpers for CHECK_NOTNULL(). Two are necessary to support both raw pointers
    358 // and smart pointers.
    359 template <typename T>
    360 T& CheckNotNullCommon(const char *file, int line, const char *names, T& t) {
    361   if (t == NULL) {
    362     LogMessageFatal(file, line, std::string(names));
    363   }
    364   return t;
    365 }
    366 
    367 template <typename T>
    368 T* CheckNotNull(const char *file, int line, const char *names, T* t) {
    369   return CheckNotNullCommon(file, line, names, t);
    370 }
    371 
    372 template <typename T>
    373 T& CheckNotNull(const char *file, int line, const char *names, T& t) {
    374   return CheckNotNullCommon(file, line, names, t);
    375 }
    376 
    377 // Check that a pointer is not null.
    378 #define CHECK_NOTNULL(val) \
    379   CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val))
    380 
    381 #ifndef NDEBUG
    382 // Debug only version of CHECK_NOTNULL
    383 #define DCHECK_NOTNULL(val) \
    384   CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val))
    385 #else
    386 // Optimized version - generates no code.
    387 #define DCHECK_NOTNULL(val) if (false)\
    388   CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val))
    389 #endif  // NDEBUG
    390 
    391 #endif  // CERCES_INTERNAL_MINIGLOG_GLOG_LOGGING_H_
    392