如何通过 boost::log 打印到具有不同属性的不同日志?

How to print to different logs with different attributes by boost::log?

本文关键字:日志 属性 boost 何通过 log 打印      更新时间:2023-10-16

例如,我的日志消息有 4 个级别(或属性):

"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 个级别(属性)。如何将带有属性的消息打印到一个日志中,将具有其他属性的消息打印到另一个日志中?

借用boost文档中的一些代码,你可能会逃脱这种方法:

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);