LSSTApplications  10.0+286,10.0+36,10.0+46,10.0-2-g4f67435,10.1+152,10.1+37,11.0,11.0+1,11.0-1-g47edd16,11.0-1-g60db491,11.0-1-g7418c06,11.0-2-g04d2804,11.0-2-g68503cd,11.0-2-g818369d,11.0-2-gb8b8ce7
LSSTDataManagementBasePackage
Log.h
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2013-2014 LSST Corporation.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <http://www.lsstcorp.org/LegalNotices/>.
21  */
22 
32 #ifndef LSST_LOG_LOG_H
33 #define LSST_LOG_LOG_H
34 
35 
36 // System headers
37 #include <stack>
38 #include <stdarg.h>
39 #include <string>
40 #include <vector>
41 
42 // Third-party headers
43 #include <log4cxx/logger.h>
44 #include <boost/format.hpp>
45 
52 #define LOG_CONFIG(filename) lsst::log::Log::configure(filename)
53 
66 #define LOG_CONFIG_PROP(string) lsst::log::Log::configure_prop(string)
67 
73 #define LOG_DEFAULT_NAME() lsst::log::Log::getDefaultLoggerName()
74 
82 #define LOG_GET(logger) lsst::log::Log::getLogger(logger)
83 
99 #define LOG_PUSHCTX(name) lsst::log::Log::pushContext(name)
100 
108 #define LOG_POPCTX() lsst::log::Log::popContext()
109 
120 #define LOG_MDC(key, value) lsst::log::Log::MDC(key, value)
121 
128 #define LOG_MDC_REMOVE(key) lsst::log::Log::MDCRemove(key)
129 
137 #define LOG_SET_LVL(logger, level) \
138  lsst::log::Log::setLevel(logger, level)
139 
148 #define LOG_GET_LVL(logger) \
149  lsst::log::Log::getLevel(logger)
150 
160 #define LOG_CHECK_LVL(logger, level) \
161  lsst::log::Log::isEnabledFor(logger, level)
162 
169 #define LOG_CHECK_TRACE() \
170  LOG4CXX_UNLIKELY(lsst::log::Log::defaultLogger->isTraceEnabled())
171 
178 #define LOG_CHECK_DEBUG() \
179  LOG4CXX_UNLIKELY(lsst::log::Log::defaultLogger->isDebugEnabled())
180 
187 #define LOG_CHECK_INFO() \
188  lsst::log::Log::defaultLogger->isInfoEnabled()
189 
196 #define LOG_CHECK_WARN() \
197  lsst::log::Log::defaultLogger->isWarnEnabled()
198 
205 #define LOG_CHECK_ERROR() \
206  lsst::log::Log::defaultLogger->isErrorEnabled()
207 
214 #define LOG_CHECK_FATAL() \
215  lsst::log::Log::defaultLogger->isFatalEnabled()
216 
226 #define LOGF(logger, level, message) \
227  do { if (lsst::log::Log::isEnabledFor(logger, level)) { \
228  lsst::log::detail::LogFormatter fmter_; \
229  lsst::log::Log::getLogger(logger)->forcedLog( \
230  log4cxx::Level::toLevel(level), (fmter_ % message).str(), \
231  LOG4CXX_LOCATION); } \
232  } while (false)
233 
242 #define LOGF_TRACE(message) \
243  do { if (LOG4CXX_UNLIKELY(lsst::log::Log::defaultLogger->isTraceEnabled())) { \
244  lsst::log::detail::LogFormatter fmter_; \
245  lsst::log::Log::defaultLogger->forcedLog( \
246  log4cxx::Level::getTrace(), (fmter_ % message).str(), \
247  LOG4CXX_LOCATION); } \
248  } while (false)
249 
258 #define LOGF_DEBUG(message) \
259  do { if (LOG4CXX_UNLIKELY(lsst::log::Log::defaultLogger->isDebugEnabled())) { \
260  lsst::log::detail::LogFormatter fmter_; \
261  lsst::log::Log::defaultLogger->forcedLog( \
262  log4cxx::Level::getDebug(), (fmter_ % message).str(), \
263  LOG4CXX_LOCATION); } \
264  } while (false)
265 
274 #define LOGF_INFO(message) \
275  do { if (lsst::log::Log::defaultLogger->isInfoEnabled()) { \
276  lsst::log::detail::LogFormatter fmter_; \
277  lsst::log::Log::defaultLogger->forcedLog( \
278  log4cxx::Level::getInfo(), (fmter_ % message).str(), \
279  LOG4CXX_LOCATION); } \
280  } while (false)
281 
290 #define LOGF_WARN(message) \
291  do { if (lsst::log::Log::defaultLogger->isWarnEnabled()) { \
292  lsst::log::detail::LogFormatter fmter_; \
293  lsst::log::Log::defaultLogger->forcedLog( \
294  log4cxx::Level::getWarn(), (fmter_ % message).str(), \
295  LOG4CXX_LOCATION); } \
296  } while (false)
297 
306 #define LOGF_ERROR(message) \
307  do { if (lsst::log::Log::defaultLogger->isErrorEnabled()) { \
308  lsst::log::detail::LogFormatter fmter_; \
309  lsst::log::Log::defaultLogger->forcedLog( \
310  log4cxx::Level::getError(), (fmter_ % message).str(), \
311  LOG4CXX_LOCATION); } \
312  } while (false)
313 
322 #define LOGF_FATAL(message) \
323  do { if (lsst::log::Log::defaultLogger->isFatalEnabled()) { \
324  lsst::log::detail::LogFormatter fmter_; \
325  lsst::log::Log::defaultLogger->forcedLog( \
326  log4cxx::Level::getFatal(), (fmter_ % message).str(), \
327  LOG4CXX_LOCATION); } \
328  } while (false)
329 
339 #define LOG(logger, level, message...) \
340  do { if (lsst::log::Log::isEnabledFor(logger, level)) { \
341  lsst::log::Log::log(logger, log4cxx::Level::toLevel(level), \
342  __BASE_FILE__, __PRETTY_FUNCTION__, __LINE__, message); } \
343  } while (false)
344 
353 #define LOG_TRACE(message...) \
354  do { if (LOG4CXX_UNLIKELY(lsst::log::Log::defaultLogger->isTraceEnabled())) { \
355  lsst::log::Log::log(lsst::log::Log::defaultLogger, \
356  log4cxx::Level::getTrace(), __BASE_FILE__, __PRETTY_FUNCTION__, \
357  __LINE__, message); } \
358  } while (false)
359 
368 #define LOG_DEBUG(message...) \
369  do { if (LOG4CXX_UNLIKELY(lsst::log::Log::defaultLogger->isDebugEnabled())) { \
370  lsst::log::Log::log(lsst::log::Log::defaultLogger, \
371  log4cxx::Level::getDebug(), __BASE_FILE__, __PRETTY_FUNCTION__, \
372  __LINE__, message); } \
373  } while (false)
374 
383 #define LOG_INFO(message...) \
384  do { if (lsst::log::Log::defaultLogger->isInfoEnabled()) { \
385  lsst::log::Log::log(lsst::log::Log::defaultLogger, \
386  log4cxx::Level::getInfo(), __BASE_FILE__, __PRETTY_FUNCTION__, \
387  __LINE__, message); } \
388  } while (false)
389 
398 #define LOG_WARN(message...) \
399  do { if (lsst::log::Log::defaultLogger->isWarnEnabled()) { \
400  lsst::log::Log::log(lsst::log::Log::defaultLogger, \
401  log4cxx::Level::getWarn(), __BASE_FILE__, __PRETTY_FUNCTION__, \
402  __LINE__, message); } \
403  } while (false)
404 
413 #define LOG_ERROR(message...) \
414  do { if (lsst::log::Log::defaultLogger->isErrorEnabled()) { \
415  lsst::log::Log::log(lsst::log::Log::defaultLogger, \
416  log4cxx::Level::getError(), __BASE_FILE__, __PRETTY_FUNCTION__, \
417  __LINE__, message); } \
418  } while (false)
419 
428 #define LOG_FATAL(message...) \
429  do { if (lsst::log::Log::defaultLogger->isFatalEnabled()) { \
430  lsst::log::Log::log(lsst::log::Log::defaultLogger, \
431  log4cxx::Level::getFatal(), __BASE_FILE__, __PRETTY_FUNCTION__, \
432  __LINE__, message); } \
433  } while (false)
434 
435 #define LOG_LVL_TRACE static_cast<int>(log4cxx::Level::TRACE_INT)
436 #define LOG_LVL_DEBUG static_cast<int>(log4cxx::Level::DEBUG_INT)
437 #define LOG_LVL_INFO static_cast<int>(log4cxx::Level::INFO_INT)
438 #define LOG_LVL_WARN static_cast<int>(log4cxx::Level::WARN_INT)
439 #define LOG_LVL_ERROR static_cast<int>(log4cxx::Level::ERROR_INT)
440 #define LOG_LVL_FATAL static_cast<int>(log4cxx::Level::FATAL_INT)
441 
442 #define LOG_LOGGER log4cxx::LoggerPtr
443 #define LOG_CTX lsst::log::LogContext
444 
445 namespace lsst {
446 namespace log {
447 
448 namespace detail {
453 public:
454 
456 
458  delete _fmter;
459  }
460 
466  template <typename T>
468  // we do not delete old _fmtiter because this method
469  // will not be called more than once per instance
470  _fmter = new boost::format(fmt);
471  return *_fmter;
472  }
473 
474 private:
476 
477  // instances cannot be copied
478  LogFormatter(const LogFormatter&);
480 };
481 
482 } // namespace detail
483 
489 class Log {
490 public:
491  static log4cxx::LoggerPtr defaultLogger;
492  static void initLog(void);
493  static void configure(void);
494  static void configure(std::string const& filename);
495  static void configure_prop(std::string const& properties);
496  static std::string getDefaultLoggerName(void);
497  static log4cxx::LoggerPtr getLogger(log4cxx::LoggerPtr logger);
498  static log4cxx::LoggerPtr getLogger(std::string const& loggername);
499  static void pushContext(std::string const& name);
500  static void popContext(void);
501  static void MDC(std::string const& key, std::string const& value);
502  static void MDCRemove(std::string const& key);
503  static void setLevel(log4cxx::LoggerPtr logger, int level);
504  static void setLevel(std::string const& loggername, int level);
505  static int getLevel(log4cxx::LoggerPtr logger);
506  static int getLevel(std::string const& loggername);
507  static bool isEnabledFor(log4cxx::LoggerPtr logger, int level);
508  static bool isEnabledFor(std::string const& loggername, int level);
509  static void vlog(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level,
510  std::string const& filename, std::string const& funcname,
511  unsigned int lineno, char const* fmt, va_list args);
512  static void log(std::string const& loggername, log4cxx::LevelPtr level,
513  std::string const& filename, std::string const& funcname,
514  unsigned int lineno, char const* fmt, ...);
515  static void log(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level,
516  std::string const& filename, std::string const& funcname,
517  unsigned int lineno, char const* fmt, ...);
518 };
519 
522 class LogContext {
523 public:
530  explicit LogContext(std::string const& name) {
531  Log::pushContext(name);
532  }
534  Log::popContext();
535  }
536 
537 private:
538  // cannot copy instances
539  LogContext(const LogContext&);
540  LogContext& operator=(const LogContext&);
541 };
542 
543 
544 }} // namespace lsst::log
545 
546 #endif // LSST_LOG_LOG_H
static log4cxx::LoggerPtr defaultLogger
Definition: Log.h:491
boost::format & operator%(T fmt)
Definition: Log.h:467
table::Key< std::string > name
Definition: ApCorrMap.cc:71
static void configure(void)
Definition: Log.cc:119
boost::format * _fmter
Definition: Log.h:475
LogFormatter & operator=(const LogFormatter &)
def log
Definition: log.py:85
static log4cxx::LoggerPtr getLogger(log4cxx::LoggerPtr logger)
Definition: Log.cc:199
static void pushContext(std::string const &name)
Definition: Log.cc:221
static std::string getDefaultLoggerName(void)
Definition: Log.cc:185
static void initLog(void)
Definition: Log.cc:104
static void vlog(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level, std::string const &filename, std::string const &funcname, unsigned int lineno, char const *fmt, va_list args)
Definition: Log.cc:345
LogContext(std::string const &name)
Definition: Log.h:530
static int getLevel(log4cxx::LoggerPtr logger)
Definition: Log.cc:301
static void MDCRemove(std::string const &key)
Definition: Log.cc:274
static void MDC(std::string const &key, std::string const &value)
Definition: Log.cc:266
static bool isEnabledFor(log4cxx::LoggerPtr logger, int level)
Definition: Log.cc:326
static void popContext(void)
Definition: Log.cc:248
static void configure_prop(std::string const &properties)
Definition: Log.cc:173
static void log(std::string const &loggername, log4cxx::LevelPtr level, std::string const &filename, std::string const &funcname, unsigned int lineno, char const *fmt,...)
Definition: Log.cc:360
static void setLevel(log4cxx::LoggerPtr logger, int level)
Definition: Log.cc:283