2015-05-18 39 views
2

我希望能够从配置指定日志严重性级别:如何从配置设置提升日志记录严重性级别?

# my config file 
LogSeverity = info 

我怎样才能做到这一点?目前,我有这样的事情在我main功能:

// logging settings 
boost::log::trivial::severity_level logSeverity; 
boost::program_options::options_description loggingSettings      
    ("Logging settings");              
loggingSettings.add_options()             
("LogSeverity", value<boost::log::trivial::severity_level>(&logSeverity)  
    ->required(),                
     "log level to output"); 

variables_map vm; 
store(parse_config_file(configFilestream, loggingSettings), vm); 
notify(vm); 

boost::log::core::get()->set_filter(           
    boost::log::trivial::severity >= logSeverity); 
BOOST_LOG_TRIVIAL(info) << "severity " << logSeverity; 

这个程序的输出是:

[2015年5月18日09:58:40.783298] [0x000007f017445078] [资讯]严重性跟踪

不过,我设定的严重性info在我的配置(如上),所以为什么它被设置为trace

+0

你是什么意思它不是“被认可”? –

+0

@LightnessRacesinOrbit我在配置中将它设置为'info',但它在输出中作为'trace'出现。我改变了问题中的措词,使其更清楚。 – arman

+0

@quant什么事?现在你已经编辑了你的问题,并添加了我的答案,有什么评论? Sill不工作? – doqtor

回答

6

工作的完整示例:

default.conf:

# my config file 
LogSeverity = info 

main.cpp中:

#include <string> 
#include <fstream> 

#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/program_options.hpp> 

int main() 
{ 
    // logging settings 
    boost::log::trivial::severity_level logSeverity; 
    boost::program_options::options_description loggingSettings 
    ("Logging settings"); 
    loggingSettings.add_options() 
    ("LogSeverity", boost::program_options::value<boost::log::trivial::severity_level>(&logSeverity) 
    ->required(), 
    "log level to output"); 

    std::ifstream conf_file("./default.conf"); 
    if (!conf_file) 
     return 1; 

    boost::program_options::variables_map variables_map; 
    boost::program_options::store(boost::program_options::parse_config_file(conf_file, loggingSettings), variables_map); 
    boost::program_options::notify(variables_map); 

    boost::log::core::get()->set_filter(
    boost::log::trivial::severity >= logSeverity); 
    BOOST_LOG_TRIVIAL(info) << "severity " << logSeverity; 

    return 0; 
} 

输出:

[2015-05-19 01:22:57.666571] [0xc000027d] [info] severity info 
0

这个问题似乎已经是你不能直接y分配给来自program_options的boost::log::trivia::severity类型。为了得到这个工作,我存储着的变量在std::string,然后用>>运营商的价值送入severity类型:

// logging settings 
std::string logSeverityString; 
boost::log::trivial::severity_level logSeverity; 
boost::program_options::options_description loggingSettings      
    ("Logging settings");              
loggingSettings.add_options()             
("LogSeverity", value<boost::log::trivial::severity_level>(&logSeverityString)  
    ->required(),                
     "log level to output"); 

variables_map vm; 
store(parse_config_file(configFilestream, loggingSettings), vm); 
notify(vm); 

std::istringstream{logSeverityString} >> logSeverity; 
boost::log::core::get()->set_filter(           
    boost::log::trivial::severity >= logSeverity); 
BOOST_LOG_TRIVIAL(info) << "severity " << logSeverity; 
+0

我已经附上完整的工作示例,它为我工作。 logSeverity应该在'notify'调用后设置。如果情况并非如此,那么有些事情是错误的。 – doqtor

+0

@doqtor有趣,这不适合我。什么是你的增强版本?我正在使用1.55。 – arman

+0

我正在使用boost 1.56 – doqtor