2013-08-02 5 views
10

부스트 1.54.0을 사용하고 있습니다. 다음은 내 문제를 설명하는 최소 예입니다.부스트 로그 severity_logger init_from_stream

부스트 로그의 severity_logger를 사용합니다. 스트림에서 싱크를 구성하려고합니다. (다음 예제에서는 문자열 스트림을 사용합니다. 실제 응용 프로그램에서는 스트림이 파일에서 나옵니다.) % Severity %를 출력 또는 필터링 용도로 사용하려고합니다.

의 문제는 다음과 같습니다. 아래 예제와 같이 사용하면 % 심각도가 비어 있습니다.

% LineID % 및 % Message %는 예상대로 채워집니다. 아웃 커밋 된 줄에 지정된대로 싱크를 설정하면 예상대로 작동합니다.

아이디어가 있으십니까?

#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/utility/setup/from_stream.hpp> 
#include <boost/log/utility/setup/console.hpp> 
#include <boost/log/expressions.hpp> 

enum SeverityLevel { trace, fatal }; 

int main (int argc, char *argv[]) 
{ 
    boost::log::add_common_attributes(); 
    /* 
    struct severity_tag; 
    boost::log::add_console_log(std::clog, 
     boost::log::keywords::format = (
      boost::log::expressions::stream 
       << boost::log::expressions::attr< unsigned int >("LineID") 
       << ": <" << boost::log::expressions::attr<SeverityLevel, severity_tag >("Severity") 
       << "> " << boost::log::expressions::smessage) 
    ); */ 

    std::stringstream s; 
    s << "[Sinks.MySink]" << std::endl; 
    s << "Destination=Console" << std::endl; 
    s << "Format=\"%LineID%: <%Severity%> - %Message%\"" << std::endl; 
    boost::log::init_from_stream(s); 

    boost::log::sources::severity_logger<SeverityLevel> lg; 
    BOOST_LOG_SEV(lg, trace) << "This is a trace message"; 
    BOOST_LOG_SEV(lg, fatal) << "This is a fatal message"; 
    return 0; 
} 
+0

그것은 appeat 것 부스트 로그에 실제로'Sinks.MySink'를 사용하도록 지시해야합니다. 슬프게도, 나는 부스트 로그 구성에 대한 경험이 없다. – sehe

+0

그건 문제가되지 않는다. 그것은 MySink를 사용하고 있습니다. 내가 제공하는 형식이 원하는대로 사용됩니다. 예외 : % Severity %는 빈 문자열로 바뀝니다. enum 값의 숫자 여야합니다. 그것은 싱크 구성의 outcommented 방법으로 잘 작동합니다. – SebastianK

답변

10

당신 말이 맞습니다. 이것은 알려진 버그이며 현재 개발 버전에서 수정되었습니다. 당신은 당신의 심각도 속성을 등록해야

:이 보고서에서 해결 된 방법 https://svn.boost.org/trac/boost/ticket/8840

여기에 링크를이 답변이 덜 의존하게하는 것입니다 : 여기

버그 보고서입니다 설정 파일을 구문 분석하기 전에 라이브러리. here을 참조하십시오. 심각도 수준을 기준으로 레코드를 필터링하려면 속성을 포맷터와 필터 파서에 모두 등록해야합니다.

확인이가 작동하지만 난 설정에서 설정을로드하기 전에 다음 두 줄을 추가 한 다음 스트림 입력/추출 기능을 추가했고 파일 :

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity"); 
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 
+2

당신은 남자입니다. 내가 설정 실수를했다고 믿었 기 때문에 내가 2 일 동안 당신의 포스트를 우연히 만났습니다 ... – quaylar

+2

몇 년 후 ... 부스트가 1.62 버전이고 지난 2 일 동안 동일한 문제를 겪고있었습니다. 이 답변 덕분에 "Severity"가 작동하도록 만들 수있었습니다. – Rado

관련 문제