Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Boost Log 2.0 : empty Severity level in logs

I'm using Boost-Log 2.0, which has some differences from version 1, and I have a hard time outputting the "Severity" attribute.

I'm using the "Boost.Format-style" formatters

"%TimeStamp% [%Uptime%] (%LineID%) <%Severity%>: %Message%" 

TimeStamp, LineID, and Message are common_attributes. Uptime is an attribute I added using attrs::timer(). I thought that Severity was automatically added when using severity_logger, but apparently it isn't and that's my problem. I get empty severities, eg:

2013-Apr-06 19:21:52.408974 [00:00:00.001337] (3) <>: A warning severity message 

Notice the empty <>. I've tried to add severity using register_simple_formatter_factory but then I get the compiler error :

error: no matching function for call to ‘register_simple_formatter_factory(const char [9])’ 

and I don't get why.

Here's my code :

#include <iostream>   #include <boost/log/common.hpp> #include <boost/log/core.hpp> #include <boost/log/trivial.hpp> #include <boost/log/expressions.hpp> #include <boost/log/sinks/text_file_backend.hpp> #include <boost/log/sinks/sync_frontend.hpp> #include <boost/log/sinks/text_ostream_backend.hpp> #include <boost/log/utility/setup/file.hpp> #include <boost/log/utility/setup/common_attributes.hpp> #include <boost/log/utility/setup/formatter_parser.hpp> #include <boost/log/sources/severity_logger.hpp> #include <boost/log/sources/severity_feature.hpp> #include <boost/log/sources/record_ostream.hpp>  #include <boost/log/attributes.hpp>  using namespace std;  namespace logging = boost::log; namespace expr = boost::log::expressions; namespace attrs = boost::log::attributes; namespace src = boost::log::sources; namespace keywords = boost::log::keywords;  enum severity_level {     DEBUG,     INFO,     WARNING,     ERROR,     CRITICAL };  BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, src::severity_logger_mt< severity_level> )  // The formatting logic for the severity level template< typename CharT, typename TraitsT > inline std::basic_ostream< CharT, TraitsT >& operator<< (     std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl) {     static const char* const str[] =     {         "DEBUG",         "INFO",         "WARNING",         "ERROR",         "CRITICAL"     };     if (static_cast< std::size_t >(lvl) < (sizeof(str) / sizeof(*str)))         strm << str[lvl];     else         strm << static_cast< int >(lvl);     return strm; }  void init() {     // logging::register_simple_formatter_factory< severity_level >("Severity");     logging::add_file_log(             keywords::file_name = "blop.log",             keywords::auto_flush = true,             keywords::open_mode = (std::ios::out | std::ios::app),             keywords::format = "%TimeStamp% [%Uptime%] (%LineID%) <%Severity%>: %Message%"             );     logging::add_common_attributes();     logging::core::get()->add_global_attribute("Uptime", attrs::timer()); }  int main(int argc, const char *argv[]) {     init();     src::severity_logger_mt< severity_level > lg = my_logger::get();     BOOST_LOG_SEV(lg, DEBUG) << "A debug severity message";     BOOST_LOG_SEV(lg, INFO) << "An informational severity message";     BOOST_LOG_SEV(lg, WARNING) << "A warning severity message";     BOOST_LOG_SEV(lg, ERROR) << "An error severity message";     BOOST_LOG_SEV(lg, CRITICAL) << "A critical severity message";     return 0; } 

Notice the commented-out line :

// logging::register_simple_formatter_factory< severity_level >("Severity"); 

which produces the mentioned error.

I compile it with:

g++ main.cpp -Wall -DBOOST_ALL_DYN_LINK  -lboost_system -lboost_log_setup -lboost_log -lboost_filesystem -lboost_date_time -lboost_thread -o main 
like image 421
Arthur Avatar asked Apr 06 '13 17:04

Arthur


People also ask

What is boost log?

Boost. Log is the logging library in Boost. It supports numerous back-ends to log data in various formats.

Is boost log thread safe?

The lg will refer to the one and only instance of the logger throughout the application, even if the application consists of multiple modules. The get function itself is thread-safe, so there is no need in additional synchronization around it.


1 Answers

Ran into the same problem (blank %Severity% in the log file AND the same compiler error when trying to add the register function). I found that the call to register_simple_formatter_factory should be:

boost::log::register_simple_formatter_factory< boost::log::trivial::severity_level, char >("Severity"); 
like image 98
W. Meert Avatar answered Sep 19 '22 21:09

W. Meert