2016-12-14 9 views
1

라이브러리의 간단한 로깅을 사용하고 있으며 현재 설정된 로거 심각도에 따라 일부 코드를 실행하려고합니다. 이것은 출력 될 경우에만 로그 메시지를 구성하기 위해 필요합니다. 하지만 심각도를 쿼리하는 올바른 방법을 찾을 수 없습니다. 또한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는 자신의 로깅 수준을 추적하는 방법에 대한 예제를 업데이트했습니다. –