【发布时间】:2017-07-07 15:23:26
【问题描述】:
我正在使用附加到 AsyncAppender 的 FileAppender 的本土变体。我正在为每个写入线程创建一个 FileAppender。我注意到当我的线程停止时(在 run() 中的 while 循环结束),FileAppender 的缓冲区中仍然有数据。
sl4fj/logback 中的写入线程如何向 Appender 发出信号,表明它现在已经完成并且 Appender 应该刷新?
谢谢
【问题讨论】:
我正在使用附加到 AsyncAppender 的 FileAppender 的本土变体。我正在为每个写入线程创建一个 FileAppender。我注意到当我的线程停止时(在 run() 中的 while 循环结束),FileAppender 的缓冲区中仍然有数据。
sl4fj/logback 中的写入线程如何向 Appender 发出信号,表明它现在已经完成并且 Appender 应该刷新?
谢谢
【问题讨论】:
听起来您有两个可能的隐藏事件来源:
根据日志文档,您可以强制 FileAppender 立即刷新:
<immediateFlush>true</immediateFlush>
根据文档,AsyncAppender 将刷新......
在应用程序关闭或重新部署时,必须停止 AsyncAppender 以停止和回收工作线程并从队列中刷新日志事件。这可以通过停止 LoggerContext 来实现,这将关闭所有附加程序,包括任何 AsyncAppender 实例。 AsyncAppender 将等待工作线程刷新到 maxFlushTime 中指定的超时。如果您发现在 LoggerContext 关闭期间排队的事件被丢弃,您可能需要增加超时时间。为 maxFlushTime 指定值 0 将强制 AsyncAppender 在从 stop 方法返回之前等待所有排队的事件被刷新。
只要 (a) 您正在停止 LoggerContext 并且 (b) 您的挂起事件可以在 maxFlushTime 指定的超时时间内被刷新,那么您就不会丢失任何事件。
但是,当然,您会看到遗留的数据......
immediateFlush 功能添加到您的 appender。【讨论】: