2016-09-13 6 views
0

로그 메시지의 길이가 너무 길면 (예 : 1000 자) boost::log 로그 메시지의 일부만 고려할 가능성이 있습니까? 이것은 가변 내용을 추적 할 때 유용 할 것입니다. 전체 정보 내용은 필요한 정보를 알아내는 데 필수적인 것은 아닙니다.부스트 로그 긴 로그 메시지 자르기

예 : 현재 디렉토리의 파일 목록과 함께 문자열을 인쇄 할 때 파일 시스템이 성공적으로 스캔되었는지 여부를 알기 위해 전체 목록을 볼 필요가 없습니다.

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::smessage 
    ) 
); 

예컨대 : boost::log::expressions::smessageboost::log::expressions::smessage::substr(0, 1000) 같은 또는 다른 방법으로 사용자 정의 할 수 있습니까?

답변

2

부스트 1.62 이후로 사용자가 묻는 것을 수행하는 데코레이터가 max_size_decor입니다. 다음과 같이 사용할 수 있습니다 :

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::max_size_decor(1000) 
     [ 
      boost::log::expressions::stream << boost::log::expressions::smessage 
     ] 
    ) 
); 

데코레이터는 채택 된 포맷터의 출력을 지정된 문자 수로 제한합니다.

자신 만의 포맷터를 만들 수도 있습니다. 여러 가지 방법으로 설명하는 답변이 this입니다. 예를 들어, 크기를 제한 할 것이라고 함수 포장 boost::phoenix::bind을 사용할 수 있습니다 :이 예에서

boost::string_view limit_size(boost::log::value_ref< 
    std::string, boost::log::expressions::tag::smessage > const& message) 
{ 
    if (!message) 
    { 
     // No message attribute in the log record 
     return boost::string_view(); 
    } 

    boost::string_view msg = message.get(); 
    return msg.substr(0, 1000); 
} 

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::phoenix::bind(&limit_size, boost::log::expressions::smessage.or_none()) 
    ) 
); 

phoenix::bind 메시지를 추출하는 래퍼 함수 객체가 로그 레코드에서 속성 값을 생성하고 당신에 전달합니다 함수는 value_ref 참조 래퍼에 래핑됩니다. 로그 레코드에 메시지가 없으면 참조 래퍼가 비어 있습니다 (즉, or_none). 어떤 limit_size이 반환 되든 포맷 프로세스의 일부로 스트림에 출력됩니다. 이 경우 boost::string_view 또는 boost::string_ref을 사용하여 문자열 복사를 피할 수 있습니다.