2015-05-18 1 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-05-18 09: 58: 40,783298] [0x000007f017445078] [информация ] тяжесть след

Однако, я установил тяжесть в info в моей конфигурации (как описано выше), так почему оно устанавливается в trace?

+0

Что вы имеете в виду, что это не «признается»? –

+0

@LightnessRacesinOrbit Я установил его в 'info' в конфиге, но он появляется как' trace' на выходе. Я изменил формулировку в вопросе, чтобы сделать это яснее. – arman

+0

@quant Что случилось? Теперь вы отредактировали свой вопрос и добавили, что в моем ответе, какие-либо комментарии? Неужели не работает? – 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 назначьте тип boost::log::trivia::severity из program_options. Для того, чтобы получить эту работу я хранить переменную в 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