我正在使用自制的FileAppender变种,它附加到AsyncAppender。我正在为每个编写线程创建一个FileAppender。我注意到当我的线程停止时(在run()中完成了while循环),FileAppender的缓冲区中仍然存在数据。
sl4fj / logback中的写入线程如何向Appender发信号通知它现在已经完成并且appender应该刷新?
由于
答案 0 :(得分:1)
听起来你有两个可能的隐瞒事件来源:
根据日志文档,您可以强制FileAppender立即刷新:
<immediateFlush>true</immediateFlush>
根据文档,AsyncAppender将刷新...
在应用程序关闭或重新部署时,必须停止AsyncAppender才能停止并回收工作线程并从队列中清除日志记录事件。这可以通过停止关闭所有appender的LoggerContext来实现,包括任何AsyncAppender实例。 AsyncAppender将等待工作线程刷新到maxFlushTime中指定的超时。如果在关闭LoggerContext期间发现排队的事件被丢弃,则可能需要增加超时时间。为maxFlushTime指定值0将强制AsyncAppender在从stop方法返回之前等待刷新所有排队事件。
只要(a)您正在停止LoggerContext并且(b)您的待处理事件可以在maxFlushTime中指定的超时内刷新,那么您将不会丢失任何事件。
但是,当然,你看到数据遗留下来......
immediateFlush
功能。