默认情况下,spdlog会让底层的libc在适当的时候进行刷新,以实现良好的性能。你可以使用以下选项来覆盖这个行为:
手动刷新
你可以使用 `logger->flush()` 函数来指示日志记录器刷新其内容。日志记录器将依次在底层的每个输出目标上调用 `flush()` 函数。
注意:如果使用异步日志记录器,`logger->flush()` 会在队列中发布一个请求刷新操作的消息,因此该函数会立即返回。这与某些旧版本的spdlog不同(旧版本会同步等待直到消息被接收并刷新完成)。目前在关闭时不需要显式调用 `logger->flush()` 或 `spdlog::shutdown()`,在程序退出时会自动完成。然而,如果你希望在 "立即" 退出函数(如 `abort()` 或 `_exit(-1)`)之前手动刷新所有异步日志记录器,请在这些函数之前调用 `spdlog::shutdown()`。
基于严重程度的刷新
你可以设置会触发自动刷新的最低日志级别。
例如,以下设置会在记录错误或更严重的消息时触发刷新:
my_logger->flush_on(spdlog::level::err);
基于时间间隔的刷新
spdlog支持设置刷新间隔。这是通过一个单独的工作线程实现的,该线程定期在每个日志记录器上调用 `flush()`。
例如,为所有注册的日志记录器启用每5秒一次的定期刷新:
spdlog::flush_every(std::chrono::seconds(5));
注意:只在线程安全的日志记录器上使用此选项,因为定期刷新是由不同的线程触发的。