2016-12-02 55 views
1

例如,我的日誌消息有4個級別(或屬性):如何通過boost :: log打印到具有不同屬性的不同日誌?

"error","warning","exception","action". 

我想打印的消息,其屬性爲「錯誤」或「例外」 fatal.log,以及屬性打印的消息是「行動」和「警告」regular.log。 通過網上搜索:

boost::shared_ptr<sinks::text_multifile_backend> backend = boost::make_shared<sinks::text_multifile_backend>(); 
backend->set_file_name_composer 
(
    sinks::file::as_file_name_composer(boost::log::expressions::stream << boost::log::expressions::attr<std::string>("level") << ".log") 
); 

typedef sinks::synchronous_sink<sinks::text_multifile_backend> sink_t; 
boost::shared_ptr<sink_t> sink(new sink_t(backend)); 

// Set the formatter 
sink->set_formatter 
    (
    boost::log::expressions::stream 
    << boost::log::expressions::attr<std::string>("level") 
    << boost::log::expressions::smessage 
    ); 

看來我可以生成由級別(屬性)不同的日誌文件,並使用

BOOST_LOG_SEV(_logger, level) << message; 

打印不同的消息給不同的記錄。但它似乎會生成4個日誌,而不僅僅是2個日誌,因爲我有4個級別(屬性)。如何將具有屬性的消息打印到一個日誌中並將具有其他屬性的消息打印到另一個日誌中

+0

你也許可以通過在你的文件水槽設置過濾器解決這個問題,一會篩選屬性等於「錯誤」或「異常「和其他」動作「和」警告「 –

回答

0

boost documentation借用一些代碼,你很可能用這種方法矇混過關:

using text_sink = sinks::synchronous_sink<sinks::text_ostream_backend>; 
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>(); 

    sink->locked_backend()->add_stream(
     boost::make_shared<std::ofstream>("regular.log")); 

    // set your 1st formatter 

    sink->set_filter(expr::has_attr(tag_attr) && (tag_attr == "action" || tag_attr == "warning")); 

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

    sink = boost::make_shared<text_sink>(); 

    sink->locked_backend()->add_stream(
     boost::make_shared<std::ofstream>("fatal.log")); 

    // set your 2nd formatter 

    sink->set_filter(expr::has_attr(tag_attr) && (tag_attr == "error" || tag_attr == "exception")); 

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

它顯示沒有合適的用戶定義的轉換從boost :: make_shared 到const boost :: make_shared 「。順便說一下,如果我想根據日期生成文件名,我可以使用sink-> locked_backend() - > add_stream( boost :: make_shared (」Regular_%Y-%m-% D_%H-%M-%S.log 「」) );? – firstaccount

+0

您能否指定在哪一行失敗?至於另一個問題,我建議閱讀文檔 –

+0

它在sink-> locked_backend() - > add_stream失敗( boost :: make_shared (「regular.log」)); – firstaccount