2016-09-27 2 views
2

로깅 출력에 일종의 범위를 얻기 위해 심각도와 채널 로거를 결합했습니다.각 레코드의 심각도와 채널을 모두 설정하십시오.

문제는 전체 프로젝트에 단일 로깅 개체를 사용하고 특정 레코드에 대한 채널을 설정할 수 있기를 원하며 심각도와 채널을 모두 설정할 수 없다는 것입니다. 나는 둘 중 하나만 설정할 수 있습니다.

예 번호 :

#include <iostream> 
#include <boost/log/trivial.hpp> 
#include <boost/log/sources/severity_channel_logger.hpp> 
#include <boost/log/utility/manipulators/add_value.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/sinks/sync_frontend.hpp> 
#include <boost/log/sinks/text_ostream_backend.hpp> 
#include <boost/log/support/date_time.hpp> 
#include <boost/core/null_deleter.hpp> 

namespace logging = boost::log; 

using logger_type = logging::sources::severity_channel_logger_mt<logging::trivial::severity_level>; 

int main() 
{ 
    logging::add_common_attributes(); 

    using text_sink_type = logging::sinks::synchronous_sink<logging::sinks::text_ostream_backend>; 
    auto sink = boost::make_shared<text_sink_type>(); 

    sink->locked_backend()->add_stream(boost::shared_ptr<std::ostream>(&std::clog, boost::null_deleter())); 

    sink->set_formatter(
     logging::expressions::stream 
      << logging::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") << " :: " 
      << '[' << logging::trivial::severity << " - " << logging::expressions::attr<std::string>("Channel") << "] " 
      << logging::expressions::smessage 
    ); 

    logging::core::get()->add_sink(sink); 


    logger_type logger; 

    auto rec = logger.open_record(logging::keywords::severity = logging::trivial::info); 
    if (rec) 
    { 
     // This do not work 
     rec.attribute_values()["Channel"] = logging::attributes::make_attribute_value(std::string{"bar"}); 

     logging::record_ostream ros{rec}; 

     // This do not work either 
     ros << logging::add_value("Channel", std::string{"foo"}); 

     ros << "Some message"; 
     ros.flush(); 
     logger.push_record(std::move(rec)); 
    } 
} 

위의 코드가 출력 된 바와 같이

 
2016-09-27 10:25:38.941645 :: [info - ] Some message 

는 채널 이름에 출력하지 않다.

auto rec = logger.open_record(logging::keywords::channel = std::string{"channel"}); 

을하지만 나는 올바른 심각도를 설정할 수 없습니다입니다 :

기록을 열 때 나는 쉽게 채널 이름을 설정할 수 있습니다.

단일 레코드에 대해 심각도와 채널을 모두 설정하는 방법이 있습니까? 아니면 채널 당 하나씩 여러 개의 로거 객체를 사용해야합니까?

선택적으로 각 출력에 대해 새 로깅 개체를 쉽게 만들 수 있지만 소량의 로깅에도 과도한 것으로 보입니다.

답변

1

open_record()은 속성 집합을 사용합니다. 후자는 오버로드 된 쉼표 연산자를 통해 빌드됩니다. 그러나 함수 인수 구분 기호로 쉼표의 해석을 억제하려면 여분의 괄호 쌍을 추가해야합니다.

auto rec = logger.open_record((logging::keywords::channel = std::string{"channel"}, logging::keywords::severity = logging::trivial::info));