libmoost
/home/mhx/git/github/libmoost/include/moost/logging/logger.hpp
Go to the documentation of this file.
00001 /* vim:set ts=3 sw=3 sts=3 et: */
00028 #ifndef MOOST_LOGGER_HPP
00029 #define MOOST_LOGGER_HPP
00030 
00043 #include <string>
00044 #include <stdexcept>
00045 #include <log4cxx/logger.h>
00046 
00047 #include <boost/preprocessor/stringize.hpp>
00048 
00049 #include "global.hpp"
00050 
00060 #ifdef MLOG_PREFIX
00061 #define MLOG_PREFIX__(msg) \
00062    BOOST_PP_STRINGIZE(MLOG_PREFIX) << " " << msg
00063 #else
00064 #define MLOG_PREFIX__(msg) msg
00065 #endif
00066 
00075 #define MLOG_LEVEL_TRACE LOG4CXX_TRACE
00076 #define MLOG_LEVEL_DEBUG LOG4CXX_DEBUG
00077 #define MLOG_LEVEL_INFO  LOG4CXX_INFO
00078 #define MLOG_LEVEL_WARN  LOG4CXX_WARN
00079 #define MLOG_LEVEL_ERROR LOG4CXX_ERROR
00080 #define MLOG_LEVEL_FATAL LOG4CXX_FATAL
00081 
00103 #define MLOG(level, logger, msg) \
00104    level(logger, MLOG_PREFIX__(msg));
00105 
00113 #define MLOG_TRACE(logger, msg) MLOG(MLOG_LEVEL_TRACE, logger, msg)
00114 #define MLOG_DEBUG(logger, msg) MLOG(MLOG_LEVEL_DEBUG, logger, msg)
00115 #define MLOG_INFO(logger, msg)  MLOG(MLOG_LEVEL_INFO, logger, msg)
00116 #define MLOG_WARN(logger, msg)  MLOG(MLOG_LEVEL_WARN, logger, msg)
00117 #define MLOG_ERROR(logger, msg) MLOG(MLOG_LEVEL_ERROR, logger, msg)
00118 #define MLOG_FATAL(logger, msg) MLOG(MLOG_LEVEL_FATAL, logger, msg)
00119 
00134 #define MLOG_NAMED_LOGGER(name) \
00135    log4cxx::Logger::getLogger(name)
00136 
00137 
00150 #define MLOG_DEFAULT_LOGGER() \
00151    log4cxx::Logger::getRootLogger()
00152 
00170 #define MLOG_NAMED_DEFINE(logger, name) \
00171    log4cxx::LoggerPtr logger = MLOG_NAMED_LOGGER(name)
00172 
00189 #define MLOG_NAMED(level, name, msg) \
00190    MLOG(level, MLOG_NAMED_LOGGER(name), msg)
00191 
00199 #define MLOG_NAMED_TRACE(name, msg) MLOG_NAMED(MLOG_LEVEL_TRACE, name, msg)
00200 #define MLOG_NAMED_DEBUG(name, msg) MLOG_NAMED(MLOG_LEVEL_DEBUG, name, msg)
00201 #define MLOG_NAMED_INFO(name, msg)  MLOG_NAMED(MLOG_LEVEL_INFO, name, msg)
00202 #define MLOG_NAMED_WARN(name, msg)  MLOG_NAMED(MLOG_LEVEL_WARN, name, msg)
00203 #define MLOG_NAMED_ERROR(name, msg) MLOG_NAMED(MLOG_LEVEL_ERROR, name, msg)
00204 #define MLOG_NAMED_FATAL(name, msg) MLOG_NAMED(MLOG_LEVEL_FATAL, name, msg)
00205 
00221 #define MLOG_DEFAULT_DEFINE(logger) \
00222    logger = MLOG_DEFAULT_LOGGER()
00223 
00240 #define MLOG_DEFAULT(level, msg) \
00241    MLOG(level, MLOG_DEFAULT_LOGGER(), msg)
00242 
00250 #define MLOG_DEFAULT_TRACE(msg) MLOG_DEFAULT(MLOG_LEVEL_TRACE, msg)
00251 #define MLOG_DEFAULT_DEBUG(msg) MLOG_DEFAULT(MLOG_LEVEL_DEBUG, msg)
00252 #define MLOG_DEFAULT_INFO(msg)  MLOG_DEFAULT(MLOG_LEVEL_INFO, msg)
00253 #define MLOG_DEFAULT_WARN(msg)  MLOG_DEFAULT(MLOG_LEVEL_WARN, msg)
00254 #define MLOG_DEFAULT_ERROR(msg) MLOG_DEFAULT(MLOG_LEVEL_ERROR, msg)
00255 #define MLOG_DEFAULT_FATAL(msg) MLOG_DEFAULT(MLOG_LEVEL_FATAL, msg)
00256 
00278 #define MLOG_ASSERT(cond, logger, msg) \
00279    if(!(cond)) \
00280    { \
00281       LOG4CXX_ASSERT(logger, false, MLOG_PREFIX__(msg)); \
00282       assert(false && "MLOG_ASSERT assertion failure"); \
00283    }
00284 
00305 #define MLOG_NAMED_ASSERT(cond, name, msg) \
00306    MLOG_ASSERT(cond, MLOG_NAMED_LOGGER(name), msg)
00307 
00326 #define MLOG_DEFAULT_ASSERT(cond, msg) \
00327    MLOG_ASSERT(cond, MLOG_DEFAULT_LOGGER(), msg)
00328 
00352 #define MLOG_TEST(level, cond, logger, msg) \
00353    if(!(cond)) MLOG(level, logger, msg);
00354 
00377 #define MLOG_NAMED_TEST(level, cond, name, msg) \
00378    MLOG(level, cond, MLOG_NAMED_LOGGER(name), msg)
00379 
00400 #define MLOG_DEFAULT_TEST(level, cond, msg) \
00401    MLOG(level, cond, MLOG_DEFAULT_LOGGER(), msg)
00402 
00410 #define MLOG_TEST_TRACE(cond, logger, msg) MLOG_TEST(MLOG_LEVEL_TRACE, cond, logger, msg)
00411 #define MLOG_TEST_DEBUG(cond, logger, msg) MLOG_TEST(MLOG_LEVEL_DEBUG, cond, logger, msg)
00412 #define MLOG_TEST_INFO(cond, logger, msg)  MLOG_TEST(MLOG_LEVEL_INFO, cond, logger, msg)
00413 #define MLOG_TEST_WARN(cond, logger, msg)  MLOG_TEST(MLOG_LEVEL_WARN, cond, logger, msg)
00414 #define MLOG_TEST_ERROR(cond, logger, msg) MLOG_TEST(MLOG_LEVEL_ERROR, cond, logger, msg)
00415 #define MLOG_TEST_FATAL(cond, logger, msg) MLOG_TEST(MLOG_LEVEL_FATAL, cond, logger, msg)
00416 
00424 #define MLOG_NAMED_TEST_TRACE(cond, name, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_TRACE, cond, name, msg)
00425 #define MLOG_NAMED_TEST_DEBUG(cond, name, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_DEBUG, cond, name, msg)
00426 #define MLOG_NAMED_TEST_INFO(cond, name, msg)  MLOG_DEFAULT_TEST(MLOG_LEVEL_INFO, cond, name, msg)
00427 #define MLOG_NAMED_TEST_WARN(cond, name, msg)  MLOG_DEFAULT_TEST(MLOG_LEVEL_WARN, cond, name, msg)
00428 #define MLOG_NAMED_TEST_ERROR(cond, name, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_ERROR, cond, name, msg)
00429 #define MLOG_NAMED_TEST_FATAL(cond, name, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_FATAL, cond, name, msg)
00430 
00438 #define MLOG_DEFAULT_TEST_TRACE(cond, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_TRACE, cond, msg)
00439 #define MLOG_DEFAULT_TEST_DEBUG(cond, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_DEBUG, cond, msg)
00440 #define MLOG_DEFAULT_TEST_INFO(cond, msg)  MLOG_DEFAULT_TEST(MLOG_LEVEL_INFO, cond, msg)
00441 #define MLOG_DEFAULT_TEST_WARN(cond, msg)  MLOG_DEFAULT_TEST(MLOG_LEVEL_WARN, cond, msg)
00442 #define MLOG_DEFAULT_TEST_ERROR(cond, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_ERROR, cond, msg)
00443 #define MLOG_DEFAULT_TEST_FATAL(cond, msg) MLOG_DEFAULT_TEST(MLOG_LEVEL_FATAL, cond, msg)
00444 
00466 #define MLOG_CHECK(cond, logger, msg) \
00467    MLOG_TEST_ERROR(cond, logger, msg)
00468 
00489 #define MLOG_NAMED_CHECK(cond, name, msg) \
00490    MLOG_CHECK(cond, MLOG_NAMED_LOGGER(name), msg)
00491 
00510 #define MLOG_DEFAULT_CHECK(cond, msg) \
00511    MLOG_CHECK(cond, MLOG_DEFAULT_LOGGER(), msg)
00512 
00534 #define MLOG_THROW(cond, logger, msg)\
00535    if(!(cond)) \
00536    { \
00537       MLOG_CHECK(false, logger, msg); \
00538       std::stringstream oss; \
00539       oss << msg; \
00540       throw std::runtime_error(oss.str()); \
00541    }
00542 
00559 #define MLOG_THROW_IF(cond, logger, msg) \
00560    do { \
00561       std::ostringstream oss; \
00562       oss << msg; \
00563       const std::string& err = oss.str(); \
00564       if (cond) \
00565          throw std::runtime_error(err); \
00566       else \
00567          MLOG_ERROR(logger, err); \
00568    } while (0)
00569 
00590 #define MLOG_NAMED_THROW(cond, name, msg) \
00591    MLOG_THROW(cond, MLOG_NAMED_LOGGER(name), msg)
00592 
00609 #define MLOG_NAMED_THROW_IF(cond, name, msg) \
00610    MLOG_THROW_IF(cond, MLOG_NAMED_LOGGER(name), msg)
00611 
00630 #define MLOG_DEFAULT_THROW(cond, msg) \
00631    MLOG_THROW(cond, MLOG_DEFAULT_LOGGER(), msg)
00632 
00647 #define MLOG_DEFAULT_THROW_IF(cond, msg) \
00648    MLOG_THROW_IF(cond, MLOG_DEFAULT_LOGGER(), msg)
00649 
00672 #define MLOG_VERIFY(cond, logger, msg) \
00673    if(!(cond)) \
00674    { \
00675       MLOG_ASSERT(false, logger, msg); \
00676       throw std::runtime_error(msg); \
00677    }
00678 
00700 #define MLOG_NAMED_VERIFY(cond, name, msg) \
00701    MLOG_VERIFY(cond, MLOG_NAMED_LOGGER(name), msg)
00702 
00722 #define MLOG_DEFAULT_VERIFY(cond, msg) \
00723    MLOG_VERIFY(cond, MLOG_DEFAULT_LOGGER(), msg)
00724 
00733 #define MLOG_GET_LEVEL_ALL log4cxx::Level::getAll()
00734 #define MLOG_GET_LEVEL_OFF log4cxx::Level::getOff()
00735 #define MLOG_GET_LEVEL_TRACE log4cxx::Level::getTrace()
00736 #define MLOG_GET_LEVEL_DEBUG log4cxx::Level::getDebug()
00737 #define MLOG_GET_LEVEL_INFO log4cxx::Level::getInfo()
00738 #define MLOG_GET_LEVEL_WARN log4cxx::Level::getWarn()
00739 #define MLOG_GET_LEVEL_ERROR log4cxx::Level::getError()
00740 #define MLOG_GET_LEVEL_FATAL log4cxx::Level::getFatal()
00741 
00751 #define MLOG_SET_LEVEL(level, logger) \
00752    logger->setLevel(level);
00753 
00763 #define MLOG_SET_NAMED_LEVEL(level, name) \
00764    MLOG_SET_LEVEL(level, MLOG_NAMED_LOGGER(name))
00765 
00775 #define MLOG_SET_DEFAULT_LEVEL(level) \
00776    MLOG_SET_LEVEL(level, MLOG_DEFAULT_LOGGER())
00777 
00785 #define MLOG_SET_LEVEL_ALL(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_ALL, logger)
00786 #define MLOG_SET_LEVEL_OFF(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_OFF, logger)
00787 #define MLOG_SET_LEVEL_TRACE(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_TRACE, logger)
00788 #define MLOG_SET_LEVEL_DEBUG(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_DEBUG, logger)
00789 #define MLOG_SET_LEVEL_INFO(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_INFO, logger)
00790 #define MLOG_SET_LEVEL_WARN(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_WARN, logger)
00791 #define MLOG_SET_LEVEL_ERROR(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_ERROR, logger)
00792 #define MLOG_SET_LEVEL_FATAL(logger) MLOG_SET_LEVEL(MLOG_GET_LEVEL_FATAL, logger)
00793 
00801 #define MLOG_SET_NAMED_LEVEL_ALL(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_ALL, MLOG_NAMED_LOGGER(name))
00802 #define MLOG_SET_NAMED_LEVEL_OFF(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_OFF, MLOG_NAMED_LOGGER(name))
00803 #define MLOG_SET_NAMED_LEVEL_TRACE(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_TRACE, MLOG_NAMED_LOGGER(name))
00804 #define MLOG_SET_NAMED_LEVEL_DEBUG(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_DEBUG, MLOG_NAMED_LOGGER(name))
00805 #define MLOG_SET_NAMED_LEVEL_INFO(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_INFO, MLOG_NAMED_LOGGER(name))
00806 #define MLOG_SET_NAMED_LEVEL_WARN(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_WARN, MLOG_NAMED_LOGGER(name))
00807 #define MLOG_SET_NAMED_LEVEL_ERROR(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_ERROR, MLOG_NAMED_LOGGER(name))
00808 #define MLOG_SET_NAMED_LEVEL_FATAL(name) MLOG_SET_LEVEL(MLOG_GET_LEVEL_FATAL, MLOG_NAMED_LOGGER(name))
00809 
00817 #define MLOG_SET_DEFAULT_LEVEL_ALL() MLOG_SET_LEVEL(MLOG_GET_LEVEL_ALL, MLOG_DEFAULT_LOGGER())
00818 #define MLOG_SET_DEFAULT_LEVEL_OFF() MLOG_SET_LEVEL(MLOG_GET_LEVEL_OFF, MLOG_DEFAULT_LOGGER())
00819 #define MLOG_SET_DEFAULT_LEVEL_TRACE() MLOG_SET_LEVEL(MLOG_GET_LEVEL_TRACE, MLOG_DEFAULT_LOGGER())
00820 #define MLOG_SET_DEFAULT_LEVEL_DEBUG() MLOG_SET_LEVEL(MLOG_GET_LEVEL_DEBUG, MLOG_DEFAULT_LOGGER())
00821 #define MLOG_SET_DEFAULT_LEVEL_INFO() MLOG_SET_LEVEL(MLOG_GET_LEVEL_INFO, MLOG_DEFAULT_LOGGER())
00822 #define MLOG_SET_DEFAULT_LEVEL_WARN() MLOG_SET_LEVEL(MLOG_GET_LEVEL_WARN, MLOG_DEFAULT_LOGGER())
00823 #define MLOG_SET_DEFAULT_LEVEL_ERROR() MLOG_SET_LEVEL(MLOG_GET_LEVEL_ERROR, MLOG_DEFAULT_LOGGER())
00824 #define MLOG_SET_DEFAULT_LEVEL_FATAL() MLOG_SET_LEVEL(MLOG_GET_LEVEL_FATAL, MLOG_DEFAULT_LOGGER())
00825 
00834 #define MLOG_GET_LEVELSTR_ALL "all"
00835 #define MLOG_GET_LEVELSTR_OFF "off"
00836 #define MLOG_GET_LEVELSTR_TRACE "trace"
00837 #define MLOG_GET_LEVELSTR_DEBUG "debug"
00838 #define MLOG_GET_LEVELSTR_INFO "info"
00839 #define MLOG_GET_LEVELSTR_WARN "warn"
00840 #define MLOG_GET_LEVELSTR_ERROR "error"
00841 #define MLOG_GET_LEVELSTR_FATAL "fatal"
00842 
00851 namespace moost { namespace logging {
00852 
00853    inline
00854    log4cxx::LevelPtr str2level(std::string const level)
00855    {
00856       log4cxx::LevelPtr invalid(new log4cxx::Level(-1, LOG4CXX_STR("INVALID"), 7 ));
00857       log4cxx::LevelPtr new_level = log4cxx::Level::toLevel(level, invalid);
00858 
00859       if (new_level == invalid)
00860       {
00861          // [29/3/2011 ricky] we really don't want this to be ignored so after much soul
00862          // searching I decided this was the best way to handle an invalid level request
00863          throw std::runtime_error("invalid level string");
00864       }
00865 
00866       return new_level;
00867    }
00868 
00869 }}
00870 
00880 #define MLOG_SET_LEVELSTR(levelstr, logger) \
00881    MLOG_SET_LEVEL(moost::logging::str2level(levelstr), logger);
00882 
00892 #define MLOG_SET_NAMED_LEVELSTR(levelstr, name) \
00893    MLOG_SET_LEVELSTR(levelstr, MLOG_NAMED_LOGGER(name))
00894 
00902 #define MLOG_SET_DEFAULT_LEVELSTR(levelstr) \
00903    MLOG_SET_LEVELSTR(levelstr, MLOG_DEFAULT_LOGGER())
00904 
00905 #endif