lsst.log  13.0-7-g73c05b9+8
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 <functional>
38 #include <sstream>
39 #include <stdarg.h>
40 #include <string>
41 #include <vector>
42 
43 // Third-party headers
44 #include <log4cxx/logger.h>
45 #include <boost/format.hpp>
46 
53 #define LOG_CONFIG(filename) lsst::log::Log::configure(filename)
54 
67 #define LOG_CONFIG_PROP(string) lsst::log::Log::configure_prop(string)
68 
74 #define LOG_DEFAULT_NAME() lsst::log::Log::getDefaultLoggerName()
75 
83 #define LOG_GET(logger) lsst::log::Log::getLogger(logger)
84 
100 #define LOG_PUSHCTX(name) lsst::log::Log::pushContext(name)
101 
109 #define LOG_POPCTX() lsst::log::Log::popContext()
110 
121 #define LOG_MDC(key, value) lsst::log::Log::MDC(key, value)
122 
129 #define LOG_MDC_REMOVE(key) lsst::log::Log::MDCRemove(key)
130 
151 #define LOG_MDC_INIT(func) lsst::log::Log::MDCRegisterInit(std::function<void()>(func))
152 
160 #define LOG_SET_LVL(logger, level) \
161  lsst::log::Log::getLogger(logger).setLevel(level)
162 
171 #define LOG_GET_LVL(logger) \
172  lsst::log::Log::getLogger(logger).getLevel()
173 
183 #define LOG_CHECK_LVL(logger, level) \
184  lsst::log::Log::getLogger(logger).isEnabledFor(level)
185 
192 #define LOG_CHECK_TRACE() \
193  LOG4CXX_UNLIKELY(lsst::log::Log::getDefaultLogger().isTraceEnabled())
194 
201 #define LOG_CHECK_DEBUG() \
202  LOG4CXX_UNLIKELY(lsst::log::Log::getDefaultLogger().isDebugEnabled())
203 
210 #define LOG_CHECK_INFO() \
211  lsst::log::Log::getDefaultLogger().isInfoEnabled()
212 
219 #define LOG_CHECK_WARN() \
220  lsst::log::Log::getDefaultLogger().isWarnEnabled()
221 
228 #define LOG_CHECK_ERROR() \
229  lsst::log::Log::getDefaultLogger().isErrorEnabled()
230 
237 #define LOG_CHECK_FATAL() \
238  lsst::log::Log::getDefaultLogger().isFatalEnabled()
239 
249 #define LOG(logger, level, message...) \
250  do { \
251  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
252  if (log.isEnabledFor(level)) { \
253  log.log(log4cxx::Level::toLevel(level), LOG4CXX_LOCATION, message); } \
254  } while (false)
255 
264 #define LOG_TRACE(message...) \
265  do { \
266  lsst::log::Log log; \
267  if (LOG4CXX_UNLIKELY(log.isTraceEnabled())) { \
268  log.log(log4cxx::Level::getTrace(), LOG4CXX_LOCATION, message); } \
269  } while (false)
270 
279 #define LOG_DEBUG(message...) \
280  do { \
281  lsst::log::Log log; \
282  if (LOG4CXX_UNLIKELY(log.isDebugEnabled())) { \
283  log.log(log4cxx::Level::getDebug(), LOG4CXX_LOCATION, message); } \
284  } while (false)
285 
294 #define LOG_INFO(message...) \
295  do { \
296  lsst::log::Log log; \
297  if (log.isInfoEnabled()) { \
298  log.log(log4cxx::Level::getInfo(), LOG4CXX_LOCATION, message); } \
299  } while (false)
300 
309 #define LOG_WARN(message...) \
310  do { \
311  lsst::log::Log log; \
312  if (log.isWarnEnabled()) { \
313  log.log(log4cxx::Level::getWarn(), LOG4CXX_LOCATION, message); } \
314  } while (false)
315 
324 #define LOG_ERROR(message...) \
325  do { \
326  lsst::log::Log log; \
327  if (log.isErrorEnabled()) { \
328  log.log(log4cxx::Level::getError(), LOG4CXX_LOCATION, message); } \
329  } while (false)
330 
339 #define LOG_FATAL(message...) \
340  do { \
341  lsst::log::Log log; \
342  if (log.isFatalEnabled()) { \
343  log.log(log4cxx::Level::getFatal(), LOG4CXX_LOCATION, message); } \
344  } while (false)
345 
346 
347 // small internal utility macro, not for regular clients
348 #define LOG_MESSAGE_VIA_STREAM_(logger, level, message) \
349  std::ostringstream stream_; \
350  stream_ << message; \
351  logger.logMsg(level, LOG4CXX_LOCATION, stream_.str())
352 
367 #define LOGS(logger, level, message) \
368  do { \
369  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
370  if (log.isEnabledFor(level)) { \
371  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::toLevel(level), message); \
372  } \
373  } while (false)
374 
386 #define LOGS_TRACE(message) \
387  do { \
388  lsst::log::Log log; \
389  if (LOG4CXX_UNLIKELY(log.isTraceEnabled())) { \
390  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getTrace(), message); \
391  } \
392  } while (false)
393 
405 #define LOGS_DEBUG(message) \
406  do { \
407  lsst::log::Log log; \
408  if (LOG4CXX_UNLIKELY(log.isDebugEnabled())) { \
409  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getDebug(), message); \
410  } \
411  } while (false)
412 
424 #define LOGS_INFO(message) \
425  do { \
426  lsst::log::Log log; \
427  if (log.isInfoEnabled()) { \
428  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getInfo(), message); \
429  } \
430  } while (false)
431 
443 #define LOGS_WARN(message) \
444  do { \
445  lsst::log::Log log; \
446  if (log.isWarnEnabled()) { \
447  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getWarn(), message); \
448  } \
449  } while (false)
450 
462 #define LOGS_ERROR(message) \
463  do { \
464  lsst::log::Log log; \
465  if (log.isErrorEnabled()) { \
466  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getError(), message); \
467  } \
468  } while (false)
469 
481 #define LOGS_FATAL(message) \
482  do { \
483  lsst::log::Log log; \
484  if (log.isFatalEnabled()) { \
485  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getFatal(), message); \
486  } \
487  } while (false)
488 
497 #define LOGL_TRACE(logger, message...) \
498  do { \
499  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
500  if (LOG4CXX_UNLIKELY(log.isTraceEnabled())) { \
501  log.log(log4cxx::Level::getTrace(), LOG4CXX_LOCATION, message);\
502  } \
503  } while (false)
504 
513 #define LOGL_DEBUG(logger, message...) \
514  do { \
515  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
516  if (LOG4CXX_UNLIKELY(log.isDebugEnabled())) { \
517  log.log(log4cxx::Level::getDebug(), LOG4CXX_LOCATION, message); \
518  } \
519  } while (false)
520 
529 #define LOGL_INFO(logger, message...) \
530  do { \
531  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
532  if (log.isInfoEnabled()) { \
533  log.log(log4cxx::Level::getInfo(), LOG4CXX_LOCATION, message); \
534  } \
535  } while (false)
536 
545 #define LOGL_WARN(logger, message...) \
546  do { \
547  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
548  if (log.isWarnEnabled()) { \
549  log.log(log4cxx::Level::getWarn(), LOG4CXX_LOCATION, message); \
550  } \
551  } while (false)
552 
561 #define LOGL_ERROR(logger, message...) \
562  do { \
563  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
564  if (log.isErrorEnabled()) { \
565  log.log(log4cxx::Level::getError(), LOG4CXX_LOCATION, message); \
566  } \
567  } while (false)
568 
577 #define LOGL_FATAL(logger, message...) \
578  do { \
579  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
580  if (log.isFatalEnabled()) { \
581  log.log(log4cxx::Level::getFatal(), LOG4CXX_LOCATION, message); \
582  } \
583  } while (false)
584 
597 #define LOGLS_TRACE(logger, message) \
598  do { \
599  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
600  if (LOG4CXX_UNLIKELY(log.isTraceEnabled())) { \
601  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getTrace(), message); \
602  } \
603  } while (false)
604 
617 #define LOGLS_DEBUG(logger, message) \
618  do { \
619  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
620  if (LOG4CXX_UNLIKELY(log.isDebugEnabled())) { \
621  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getDebug(), message); \
622  } \
623  } while (false)
624 
637 #define LOGLS_INFO(logger, message) \
638  do { \
639  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
640  if (log.isInfoEnabled()) { \
641  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getInfo(), message); \
642  } \
643  } while (false)
644 
657 #define LOGLS_WARN(logger, message) \
658  do { \
659  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
660  if (log.isWarnEnabled()) { \
661  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getWarn(), message); \
662  } \
663  } while (false)
664 
677 #define LOGLS_ERROR(logger, message) \
678  do { \
679  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
680  if (log.isErrorEnabled()) { \
681  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getError(), message); \
682  } \
683  } while (false)
684 
697 #define LOGLS_FATAL(logger, message) \
698  do { \
699  lsst::log::Log log(lsst::log::Log::getLogger(logger)); \
700  if (log.isFatalEnabled()) { \
701  LOG_MESSAGE_VIA_STREAM_(log, log4cxx::Level::getFatal(), message); \
702  } \
703  } while (false)
704 
705 #define LOG_LVL_TRACE static_cast<int>(log4cxx::Level::TRACE_INT)
706 #define LOG_LVL_DEBUG static_cast<int>(log4cxx::Level::DEBUG_INT)
707 #define LOG_LVL_INFO static_cast<int>(log4cxx::Level::INFO_INT)
708 #define LOG_LVL_WARN static_cast<int>(log4cxx::Level::WARN_INT)
709 #define LOG_LVL_ERROR static_cast<int>(log4cxx::Level::ERROR_INT)
710 #define LOG_LVL_FATAL static_cast<int>(log4cxx::Level::FATAL_INT)
711 
712 #define LOG_LOGGER lsst::log::Log
713 #define LOG_CTX lsst::log::LogContext
714 
715 namespace lsst {
716 namespace log {
717 
723 class Log {
724 public:
725 
726  /***
727  * Default constructor creates an instance of "current" logger.
728  *
729  * Initially current logger is the same as root logger, but
730  * current can be changed via pushContext()/popContext().
731  */
732  Log() : _logger(_defaultLogger()) { }
733 
737  bool isDebugEnabled() const { return _logger->isDebugEnabled(); }
741  bool isErrorEnabled() const { return _logger->isErrorEnabled(); }
745  bool isFatalEnabled() const { return _logger->isFatalEnabled(); }
749  bool isInfoEnabled() const { return _logger->isInfoEnabled(); }
753  bool isTraceEnabled() const { return _logger->isTraceEnabled(); }
757  bool isWarnEnabled() const { return _logger->isWarnEnabled(); }
758 
759  std::string getName() const;
760  void setLevel(int level);
761  int getLevel() const;
762  bool isEnabledFor(int level) const;
763 
765  static Log getDefaultLogger() { return Log(_defaultLogger()); }
766  static std::string getDefaultLoggerName();
767 
768  static void configure();
769  static void configure(std::string const& filename);
770  static void configure_prop(std::string const& properties);
771 
772  static Log getLogger(Log const& logger) { return logger; }
773  static Log getLogger(std::string const& loggername);
774 
775  static void pushContext(std::string const& name);
776  static void popContext();
777  static void MDC(std::string const& key, std::string const& value);
778  static void MDCRemove(std::string const& key);
779  static int MDCRegisterInit(std::function<void()> function);
780 
781  void log(log4cxx::LevelPtr level,
782  log4cxx::spi::LocationInfo const& location,
783  char const* fmt, ...);
784  void logMsg(log4cxx::LevelPtr level,
785  log4cxx::spi::LocationInfo const& location,
786  std::string const& msg);
787 
788 private:
789 
795  static log4cxx::LoggerPtr const& _defaultLogger(log4cxx::LoggerPtr const& newDefault=log4cxx::LoggerPtr());
796 
802  Log(log4cxx::LoggerPtr const& logger) : Log() { _logger = logger; }
803 
804  log4cxx::LoggerPtr _logger;
805 };
806 
809 class LogContext {
810 public:
817  explicit LogContext(std::string const& name) {
818  Log::pushContext(name);
819  }
820  ~LogContext() {
821  Log::popContext();
822  }
823 
824 private:
825  // cannot copy instances
826  LogContext(const LogContext&);
827  LogContext& operator=(const LogContext&);
828 };
829 
830 
838 unsigned lwpID();
839 
840 }} // namespace lsst::log
841 
842 #endif // LSST_LOG_LOG_H
int getLevel() const
Definition: Log.cc:354
std::string getName() const
Definition: Log.cc:238
bool isDebugEnabled() const
Definition: Log.h:737
void logMsg(log4cxx::LevelPtr level, log4cxx::spi::LocationInfo const &location, std::string const &msg)
Definition: Log.cc:394
bool isInfoEnabled() const
Definition: Log.h:749
Definition: Log.h:723
bool isTraceEnabled() const
Definition: Log.h:753
static void configure()
Definition: Log.cc:173
bool isWarnEnabled() const
Definition: Log.h:757
bool isErrorEnabled() const
Definition: Log.h:741
static Log getDefaultLogger()
Return default logger instance, same as default constructor.
Definition: Log.h:765
Definition: Log.h:715
static void MDC(std::string const &key, std::string const &value)
Definition: Log.cc:312
void setLevel(int level)
Definition: Log.cc:347
bool isFatalEnabled() const
Definition: Log.h:745
bool isEnabledFor(int level) const
Definition: Log.cc:369
void log(log4cxx::LevelPtr level, log4cxx::spi::LocationInfo const &location, char const *fmt,...)
Definition: Log.cc:380
static void pushContext(std::string const &name)
Definition: Log.cc:266
unsigned lwpID()
Definition: Log.cc:419
static void popContext()
Definition: Log.cc:293
LogContext(std::string const &name)
Definition: Log.h:817
static std::string getDefaultLoggerName()
Definition: Log.cc:231
static void configure_prop(std::string const &properties)
Definition: Log.cc:213
Definition: Log.h:809
static void MDCRemove(std::string const &key)
Definition: Log.cc:324