我正在使用FileAppender的本地版本,该版本附加到AsyncAppender。我正在为每个写入线程创建一个FileAppender。我注意到,当我的线程停止运行(在run()的while循环中完成)时,FileAppender的缓冲区中仍然还有数据。

sl4fj / logback中的写入线程如何通知Appender现在已完成并且追加程序应该刷新?

谢谢

最佳答案

听起来您有两个可能的隐式事件来源:


AsyncAppender
FileAppender


根据日志文档,您可以强制FileAppender立即刷新:


  <immediateFlush>true</immediateFlush>


根据文档,AsyncAppender将刷新…


  在应用程序关闭或重新部署后,必须停止AsyncAppender才能停止并回收工作线程,并从队列中清除日志记录事件。这可以通过停止LoggerContext来完成,该LoggerContext将关闭所有附加程序,包括任何AsyncAppender实例。 AsyncAppender将等待工作线程刷新到maxFlushTime中指定的超时。如果您发现在LoggerContext关闭期间正在丢弃排队的事件,则可能需要增加超时时间。将maxFlushTime指定为0值将强制AsyncAppender在从stop方法返回之前等待刷新所有排队的事件。


只要(a)您正在停止LoggerContext和(b)您的未决事件可以在maxFlushTime中指定的超时内刷新,那么您就不会丢失任何事件。

但是,当然,您看到的是数据遗留下来的……


如果数据留在AsyncAppender中,则只需确保关闭LoggingContext(可以使用shutdown hook来确保发生这种情况)
如果数据留在您自己的FileAppender变体中,请考虑将等效的logback的immediateFlush功能添加到附加程序。

10-06 05:34