可以配置boost日志刷新吗?

时间:2018-10-22 23:05:54

标签: c++ boost boost-log

我使用的是增强日志,除了刷新的方式外,其他一切通常看起来都像我期望的那样。我感谢缓冲和写入频率降低对性能的潜在价值,但似乎开箱即用:

  1. 旋转日志。
  2. 程序完成。
  3. 每8 K字节左右。

有没有办法调整这种行为?特别是,如果它在某个超时后刷新而不是永远等待该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)登录。

1 个答案:

答案 0 :(得分:0)

Boost.Log不会启动内部线程,除非您使用异步日志记录,即使您使用异步日志记录,专用线程也没有延迟刷新的功能。因此,接收器在延迟后无法刷新缓冲的数据。

您可以做的是通过在自己的线程中调用core::flush()定期刷新所有接收器。