我使用的是增强日志,除了刷新的方式外,其他一切通常看起来都像我期望的那样。我感谢缓冲和写入频率降低对性能的潜在价值,但似乎开箱即用:
有没有办法调整这种行为?特别是,如果它在某个超时后刷新而不是永远等待该8K边界,那就太好了。
尽管有一个颇受欢迎的答案是通过auto_flush = true
(请参阅https://stackoverflow.com/a/18036016/629530)来关闭缓冲,但我宁愿不关闭缓冲,因为这似乎可能会妨碍性能。我们正在写的日志可能很频繁。
这是我当前的实现(请注意,我使用以下代码获取以整数形式记录的ProcessID和ThreadID:https://stackoverflow.com/a/45013899/629530)
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(
logger,
boost::log::sources::severity_logger_mt< >);
auto logger = logging::add_file_log
(
keywords::file_name = "diagnostic_%N.log",
keywords::max_files = 10, // Only keep 10 rotated files around.
keywords::rotation_size = 10 * 1024 * 1024, // Rotate every 10 MB.
keywords::time_based_rotation =
sinks::file::rotation_at_time_point(3, 37, 0), // Rotate everyday at 3:37 AM.
keywords::target = directory,
keywords::format =
(
expr::stream
<< expr::format_date_time< boost::posix_time::ptime >(
"TimeStamp", "%b %d %H:%M:%S")
<< boost::phoenix::bind(
&get_native_process_id, process_id.or_none()) << " "
<< boost::phoenix::bind(
&get_native_thread_id, thread_id.or_none()) << " "
<< expr::message
)
);
// We don't expect boost log exceptions, but if they arise discard them.
logging::core::get()->set_exception_handler(logging::make_exception_suppressor());
logging::add_common_attributes();
然后我通过BOOST_LOG_TRIVIAL(info)
登录。
答案 0 :(得分:0)
Boost.Log不会启动内部线程,除非您使用异步日志记录,即使您使用异步日志记录,专用线程也没有延迟刷新的功能。因此,接收器在延迟后无法刷新缓冲的数据。
您可以做的是通过在自己的线程中调用core::flush()
定期刷新所有接收器。