2016-12-14 8 views
1

Я использую тривиальное протоколирование библиотеки boost::log, и я хочу выполнить некоторый код в зависимости от установленного в настоящее время степени сложности журнала. Это необходимо для построения сообщения журнала, только если оно будет выведено. Но я не могу найти правильный способ для запроса серьезности. Код должен быть что-то вроде:Как запросить boost :: log severity?

if (boost::log::trivial::severity <= 
    boost::log::trivial::severity_level::trace) 
{ 
    // construct log message 
    BOOST_LOG_TRIVIAL(trace) << message; 
} 

Кроме того, может быть есть какой-то способ, когда я знаю, что сообщение будет выводиться, чтобы избежать двойной проверки серьезности и выводить его непосредственно вместо использования BOOST_LOG_TRIVIAL макросъемки?

ответ

1

Это не работает. Вы должны предоставить функцию фильтра для увеличения :: войти :: тривиальным согласно документации:

http://www.boost.org/doc/libs/1_61_0/libs/log/doc/html/log/tutorial/trivial_filtering.html

void init() 
{ 
    logging::core::get()->set_filter 
    (
     // here they've used a constant but you could use a global or 
     // a function 
     logging::trivial::severity >= logging::trivial::info 
    ); 
} 

int main(int, char*[]) 
{ 
    init(); 

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; 
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; 
    BOOST_LOG_TRIVIAL(info) << "An informational severity message"; 
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message"; 
    BOOST_LOG_TRIVIAL(error) << "An error severity message"; 
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message"; 

    return 0; 
} 

Объект, передаваемый logging::core::set_filter имеет тип boost::log::filter

Вы могли бы так же легко написать:

auto filt = logging::filter(logging::trivial::severity >= logging::trivial::info); 
logging::core::get()->set_filter(filt); 

filt представляет собой легкий функциональный объект, чья работа состоит в том, чтобы проверить атрибуты, отправленные ему, и возвращать, будут ли все тесты против этих атрибутов возвращаться true. В этом случае существует только один тест - logging::trivial::severity >= logging::trivial::info.

Задача регистратора - создать набор атрибутов и передать его boost::log::core, когда он хочет что-то испустить.

Долгий и короткий, что вы должны отслеживать уровень ведения журнала в своей переменной. Вот один из способов:

#include <iostream> 
#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 

namespace logging = boost::log; 


int main(int, char*[]) 
{ 
    // track your own variable here 
    logging::trivial::severity_level my_log_level = logging::trivial::trace; 

    // with this filter 
    auto filt = logging::filter(logging::trivial::severity >= my_log_level); 
    logging::core::get()->set_filter(filt); 

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; 
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; 
    BOOST_LOG_TRIVIAL(info) << "An informational severity message"; 
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message"; 
    BOOST_LOG_TRIVIAL(error) << "An error severity message"; 
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message"; 

    // now you have control 
    if (my_log_level <= logging::trivial::trace) 
    { 
     std::cout << "tracing\n"; 
    } 


    return 0; 
} 
+0

Это не отвечает на вопрос. Должен быть какой-то способ условно выполнить произвольный код в соответствии с серьезностью. – bobeff

+0

Выяснит ответ. К сожалению, вы ошибочно принимаете –

+0

@bobeff ответ обновляется с примером того, как отслеживать свой собственный уровень ведения журнала –