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

时间:2017-07-11 15:33:41

标签: c++ c++11 visual-studio-2015 boost-log

我在整个项目中使用了几个severity_channel_logger_mt个实例,其中包含不同的"频道"属性。但是,对于一个特定的日志行,我想设置"频道"直接在通话中属性。使用宏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";

在上面的示例中,&#34;消息1&#34;应来自&#34; test-subsystem&#34;,但其他消息应来自&#34; global&#34;渠道。如果open_record()rc.reset();行被注释掉,则这两条消息都来自&#34;测试系统&#34;

更新

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

  • 我为这些日志消息创建了专用记录器
  • 我使用BOOST_LOG_CHANNEL_SEV()登录此记录器,该记录器接受参数设置&#34;频道&#34;每次通话时的姓名

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

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

1 个答案:

答案 0 :(得分:3)

  

有更优雅的方式吗?

正如您在频道功能reference部分中看到的那样,有一种channel方法,可用于设置频道名称。此方法由记录器继承。

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