boost::log中如何临时禁用控制台输出以仅保留文件日志
如何在Boost Log中临时禁用控制台输出
嘿,针对你这个需求,Boost Log提供了几种灵活的实现方式,我给你梳理几个实用的办法:
方案一:自定义属性+接收器过滤(推荐局部作用域使用)
这个方法适合在某一段代码范围内临时禁用控制台输出,离开这个作用域后自动恢复正常,非常灵活。
步骤1:定义自定义属性
首先我们需要一个标记用的属性,用来标识哪些日志不需要输出到控制台:
// 定义属性键,用来标记是否禁用控制台输出 BOOST_LOG_ATTRIBUTE_KEYWORD(disable_console, "DisableConsole", bool)
步骤2:配置控制台接收器时添加过滤规则
在初始化控制台接收器的时候,给它加个过滤条件:只接受disable_console属性不为true的日志:
// 保存控制台接收器的指针(后续如果需要全局调整也能用) auto console_sink = boost::log::add_console_log(); // 设置过滤逻辑:排除掉标记了禁用控制台的日志 console_sink->set_filter(!disable_console || disable_console == false);
步骤3:在需要禁用的代码块中设置属性
用BOOST_LOG_SCOPED_THREAD_ATTR设置线程局部的属性,这个属性会在当前代码块结束后自动失效,不用手动恢复:
{ // 进入这个作用域后,控制台输出被临时禁用 BOOST_LOG_SCOPED_THREAD_ATTR(disable_console, boost::log::attributes::constant<bool>(true)); // 这里的日志只会输出到文件,不会出现在控制台 BOOST_LOG_SEV(logger, boost::log::trivial::info) << "这条日志仅写入文件"; } // 离开作用域后,控制台输出自动恢复正常 BOOST_LOG_SEV(logger, boost::log::trivial::info) << "这条日志同时输出到文件和控制台";
方案二:直接控制控制台接收器的启用状态(适合全局/大块代码控制)
如果需要在较大的代码区域或者做全局开关式的控制台控制,可以直接操作接收器的启用状态:
步骤1:保存控制台接收器的指针
初始化日志的时候,把add_console_log返回的接收器指针保存下来(可以存在全局变量或类成员中):
// 全局或类成员变量中保存接收器指针 boost::log::sinks::sink_ptr console_sink; // 初始化日志的函数 void init_logging() { // 先配置文件日志... console_sink = boost::log::add_console_log(); }
步骤2:在需要禁用的位置切换状态
直接调用set_enabled方法就能启用或禁用控制台接收器:
// 禁用控制台输出 console_sink->set_enabled(false); // 这段代码里的日志只会写入文件 BOOST_LOG_SEV(logger, boost::log::trivial::info) << "仅文件输出的日志"; // 恢复控制台输出 console_sink->set_enabled(true); // 日志恢复正常的双输出 BOOST_LOG_SEV(logger, boost::log::trivial::info) << "同时输出到文件和控制台";
方案三:针对特定日志记录器设置过滤(适合专属logger的控制)
如果你有多个不同职责的日志记录器,可以给专门的文件日志记录器设置过滤规则,让它的日志只流向文件接收器:
// 创建一个专门用于文件输出的日志记录器 boost::log::logger file_only_logger; // 给文件接收器添加一个标记属性 auto file_sink = boost::log::add_file_log("app.log"); file_sink->set_filter(boost::log::expressions::attr<std::string>("SinkTag") == "file"); // 给file_only_logger绑定这个标记属性 file_only_logger.add_attribute("SinkTag", boost::log::attributes::constant<std::string>("file")); // 使用这个logger时,日志只会输出到文件 BOOST_LOG_SEV(file_only_logger, boost::log::trivial::info) << "专属文件输出的日志";
内容的提问来源于stack exchange,提问作者Ghorm
相关产品推荐
相关产品推荐

