boost::log 设置"Channel"通道记录器中的属性
boost::log setting "Channel" attribute in a channel logger
我在整个项目中使用多个具有不同"通道"属性的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
方法,可用于设置通道名称。此方法由记录器继承。
但是,出于性能原因,通常建议避免修改通道名称。当您有多个具有相应通道名称的不同子系统时,最好为每个子系统专用一个单独的记录器。否则,您需要为在每个日志记录上设置通道名称以及必要的线程同步而支付性能开销。
相关文章:
- 创建 Spdlog 异步文件记录器时遇到困难
- 如何将自定义记录器与websocketpp一起使用?
- 在C++中隐藏键盘记录器的控制台窗口
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- 麻烦得到提升::记录器编译
- 我正在尝试用 c++ 制作一个日志记录框架,但信息没有传递给记录器的子组件,我做错了什么?
- 多态记录器(虚拟模板化函数?
- 设置提升记录器的线程名称
- Boost Log的琐碎记录器"lazy evaluation"是如何工作的?
- boost::log 设置"Channel"通道记录器中的属性
- 区分键盘记录器中的密码和其他类型的键盘输入
- 记录器的流界面,C
- 如何监控Android和iOS上的所有击键操作,如Windows键盘记录器
- 如何声明和定义 Poco 记录器
- 记录器何时应刷新
- 带有 gtest 框架的 spdlog 记录器不起作用
- 如何将按钮添加到节点的属性编辑器面板,该面板调用该节点内的方法?
- 使用常量字符*时如何使用带有模板的记录器
- 如何防止升压记录器在每条记录后添加?