boost::log 的临时禁用控制台输出
Temporary disable console output for boost::log
我通过 boost::log::add_file_log
添加接收器到文件,通过 boost::log::add_console_log
添加控制台输出。我正在通过 BOOST_LOG_SEV
调用记录器,一切正常。但是有一个地方,一个want output only to the file.
如何在某些地方禁用 cosole 输出?
您可以使用 remove_sink()
函数轻松完成。
console_sink = boost::log::add_console_log(std::cout);
boost::log::core::get()->remove_sink(console_sink);
之后您可以再次调用 add_console_log()
并启用控制台输出。
您可以使用属性和过滤器来实现这一点。例如,您可以在控制台接收器中设置一个过滤器,以抑制任何附加(或不附加,取决于您的偏好)特定属性值的日志记录。
boost::log::add_console_log
(
...
boost::log::keywords::filter = !boost::log::expressions::has_attr("NoConsole")
...
);
那么你可以在控制台不应该输出日志的代码区域设置这个属性。例如,您可以使用范围属性:
BOOST_LOG_SCOPED_THREAD_ATTR("NoConsole", true);
BOOST_LOG(logger) << "No console output";
您可以使用任何设置属性的方法 - 作为线程本地属性或特定于记录器的属性,这都没有关系。
与临时删除接收器的重要区别在于,具有属性的解决方案不会影响在您暂停控制台输出时可能正在记录的其他线程。
我通过 boost::log::add_file_log
添加接收器到文件,通过 boost::log::add_console_log
添加控制台输出。我正在通过 BOOST_LOG_SEV
调用记录器,一切正常。但是有一个地方,一个want output only to the file.
如何在某些地方禁用 cosole 输出?
您可以使用 remove_sink()
函数轻松完成。
console_sink = boost::log::add_console_log(std::cout);
boost::log::core::get()->remove_sink(console_sink);
之后您可以再次调用 add_console_log()
并启用控制台输出。
您可以使用属性和过滤器来实现这一点。例如,您可以在控制台接收器中设置一个过滤器,以抑制任何附加(或不附加,取决于您的偏好)特定属性值的日志记录。
boost::log::add_console_log
(
...
boost::log::keywords::filter = !boost::log::expressions::has_attr("NoConsole")
...
);
那么你可以在控制台不应该输出日志的代码区域设置这个属性。例如,您可以使用范围属性:
BOOST_LOG_SCOPED_THREAD_ATTR("NoConsole", true);
BOOST_LOG(logger) << "No console output";
您可以使用任何设置属性的方法 - 作为线程本地属性或特定于记录器的属性,这都没有关系。
与临时删除接收器的重要区别在于,具有属性的解决方案不会影响在您暂停控制台输出时可能正在记录的其他线程。