logback FileAppender - > AsyncAppender刷新信号

时间:2017-07-07 15:23:26

标签: java logback slf4j

我正在使用自制的FileAppender变种,它附加到AsyncAppender。我正在为每个编写线程创建一个FileAppender。我注意到当我的线程停止时(在run()中完成了while循环),FileAppender的缓冲区中仍然存在数据。

sl4fj / logback中的写入线程如何向Appender发信号通知它现在已经完成并且appender应该刷新?

由于

1 个答案:

答案 0 :(得分:1)

听起来你有两个可能的隐瞒事件来源:

  • AsyncAppender
  • FileAppender

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

  

<immediateFlush>true</immediateFlush>

根据文档,AsyncAppender将刷新...

  

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

只要(a)您正在停止LoggerContext并且(b)您的待处理事件可以在maxFlushTime中指定的超时内刷新,那么您将不会丢失任何事件。

但是,当然,你看到数据遗留下来......

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