2016-12-02 49 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