diff --git a/log.cpp b/log.cpp index a082d5f8..a4798688 100644 --- a/log.cpp +++ b/log.cpp @@ -32,6 +32,8 @@ using namespace util; using std::string; using std::map; + +/////////////////////////////////////////////////////////////////////////////// void check_level (level_t l) { @@ -39,6 +41,7 @@ check_level (level_t l) CHECK (l >= 0 && l < NUM_LEVELS); } +//----------------------------------------------------------------------------- const string& level_to_string (level_t l) { check_level (l); @@ -58,6 +61,7 @@ level_to_string (level_t l) { } +/////////////////////////////////////////////////////////////////////////////// static level_t string_to_level (string name) { static const map NAME_LEVELS = { @@ -83,6 +87,7 @@ string_to_level (string name) { } +//----------------------------------------------------------------------------- std::ostream& util::operator<< (std::ostream& os, level_t l) { os << level_to_string (l); @@ -90,11 +95,7 @@ util::operator<< (std::ostream& os, level_t l) { } -void -util::log (level_t l, const std::string &format) - { detail::log (l, boost::format (format)); } - - +/////////////////////////////////////////////////////////////////////////////// static level_t log_level (void) { const char *env = getenv ("LOG_LEVEL"); @@ -109,6 +110,13 @@ log_level (void) { } +/////////////////////////////////////////////////////////////////////////////// +void +util::log (level_t l, const std::string &format) + { detail::log (l, boost::format (format)); } + + +//----------------------------------------------------------------------------- void util::detail::log (level_t level, boost::format &&format) { static const level_t LOG_LEVEL = log_level (); @@ -137,13 +145,16 @@ util::detail::log (level_t level, boost::format &&format) { } -scoped_logger::scoped_logger (const level_t _level, - const std::string &_message): +/////////////////////////////////////////////////////////////////////////////// +scoped_logger::scoped_logger (level_t _level, + std::string &&_message): m_level (_level), - m_message (_message) + m_message (std::move (_message)) { ; } -scoped_logger::~scoped_logger () { +//----------------------------------------------------------------------------- +scoped_logger::~scoped_logger () +{ log (m_level, m_message); } diff --git a/log.hpp b/log.hpp index a9f5f28c..7f32602a 100644 --- a/log.hpp +++ b/log.hpp @@ -28,6 +28,7 @@ #endif namespace util { + /////////////////////////////////////////////////////////////////////////// // rfc5424 log levels. It is assumed they are contiguous to simplify array // indexing in logging code. // @@ -47,14 +48,19 @@ namespace util { DEFAULT = INFO }; + //------------------------------------------------------------------------- std::ostream& operator<< (std::ostream&, level_t); + + /////////////////////////////////////////////////////////////////////////// void log (level_t, const std::string &format); template void log (level_t, const std::string &format, tail ..._tail); + + //------------------------------------------------------------------------- #define LOG_EMERGENCY(...) do { util::log(util::EMERGENCY, ##__VA_ARGS__); } while (0) #define LOG_ALERT(...) do { util::log(util::ALERT, ##__VA_ARGS__); } while (0) #define LOG_CRITICAL(...) do { util::log(util::CRITICAL, ##__VA_ARGS__); } while (0) @@ -70,15 +76,17 @@ namespace util { #endif + /////////////////////////////////////////////////////////////////////////// class scoped_logger : public nocopy { - public: - scoped_logger (const level_t, const std::string&); - ~scoped_logger (); + public: + scoped_logger (const level_t, std::string&&); + ~scoped_logger (); - protected: - const level_t m_level; - const std::string &m_message; + protected: + level_t m_level; + std::string m_message; }; + } #include "log.ipp"