boost::log 在频道记录器中设置 "Channel" 属性

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

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

我发现将通道属性更改回原始值的唯一方法是:误用记录器对象的 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";

在上面的例子中,"Message 1"应该来自"test-subsystem",但其他消息应该来自"global"频道。如果 open_record()rc.reset(); 行被注释掉,则两条消息都来自 "test-system"


更新:

我最终实施了一个略有不同的解决方案

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

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

is there a more elegant way of doing this?

正如您在频道功能reference部分看到的,有一个channel方法,可以用来设置频道名称。该方法被logger继承

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