boost::log 设置"Channel"通道记录器中的属性

boost::log setting "Channel" attribute in a channel logger

本文关键字:属性 记录器 Channel log 设置 boost 通道      更新时间:2023-10-16

我在整个项目中使用多个具有不同"通道"属性的severity_channel_logger_mt实例。但是,对于一个特定的日志行,我想直接在调用中设置"Channel"属性。使用宏BOOST_LOG_CHANNEL_SEV(logger, channel, severity),这其实并不难做到。但是,这会更改"频道"属性。后续日志记录调用将不使用初始通道属性,而是使用上次日志记录调用中更改的属性。

我发现将通道属性更改回原始值的唯一方法是:误用记录器对象的open_record()函数。

我的问题:有没有更优雅的方法?是否有允许直接设置记录器属性的特定功能?

突出显示该过程的代码片段:

auto & lg = global_logger::get();
BOOST_LOG_CHANNEL_SEV(lg, "test-subsystem",  exec_severity) << "Message 1";
// misuse the open_record call to set the channel attribute
// reset channel name back to "global"
auto rc = lg.open_record(boost::log::keywords::channel = "global" );
rc.reset();  // attempt to clean-up a bit
BOOST_LOG_CHANNEL(lg, exec_severity) << "Message 2";
在上面的例子中,"消息 1"应来自">

测试子系统",但其他消息应来自"全局"通道。如果注释掉open_record()行和rc.reset();行,则两条消息都来自"测试系统">


更新:

我最终实施了一个稍微不同的解决方案

  • 我为这些日志消息创建了一个专用的记录器
  • 我使用BOOST_LOG_CHANNEL_SEV()登录到此记录器,该记录器需要一个参数来设置每次调用的"通道"名称

上面更新的代码片段如下所示:

auto & stlog = global_logger::get();
auto & lg = special_logger::get();
BOOST_LOG_CHANNEL_SEV(lg, "test-subsystem",  exec_severity) << "Message 1";
// this log line will be in channel "global" again
BOOST_LOG_SEV(stlog, exec_severity) << "Message 2";

有没有更优雅的方法呢?

正如您在通道功能参考部分看到的,有一个channel方法,可用于设置通道名称。此方法由记录器继承。

但是,出于性能原因,通常建议避免修改通道名称。当您有多个具有相应通道名称的不同子系统时,最好为每个子系统专用一个单独的记录器。否则,您需要为在每个日志记录上设置通道名称以及必要的线程同步而支付性能开销。