log4j2:刷新Async appender的记录器缓冲区

时间:2016-12-07 14:11:21

标签: java logging log4j2

我有@CustomComponent({ selector: 'sub' }) export class SubComponent { } 的Async appender。

在某些情况下,我需要强行冲洗缓冲区。我怎么能这样做?

我没有关闭LogManager的内容,因此bufferSize="512"不是一个选项。

请帮忙!

更新:以下是我的log4j2.xml的一部分:

LogManager.shutdown();

我在Async appender中有一个Kafka appender。不幸的是,Kafka appender和Async appender都没有immediateFlush字段。

2 个答案:

答案 0 :(得分:1)

AsyncAppender使用的缓冲区没有刷新的概念。此缓冲区中的事件尚未处理,因此无法刷新。从队列中取出事件的速度取决于底层的Appender。

您是否正在寻找丢弃当前队列中所有事件的方法?如果是这样,你能详细说明你的用例吗? (该应用程序将简单地向队列中添加更多LogEvent,因此我无法看到丢弃排队事件如何有用......)

评论后更新:

我建议你重新配置而不是停止一些Appender,同时保持其他人运行。如果设置了monitorInterval,则可以更改配置文件以删除要停止的Appender。作为重新配置过程的一部分,Log4j2将确保在Appender停止之前完全处理在Async Appender中排队的日志事件。

答案 1 :(得分:0)

This answer可能会解决您的问题...您只需找到一个特定的appender而不是刷新所有这些。但是,在您的情况下可能不需要刷新消息...

您也可以使用此技术编写一种方法,该方法将写入给定的消息,然后立即刷新,然后为将来的消息调用setImmediateFlush(false)...