【问题标题】:log4j2: Flush logger buffer for an Async appenderlog4j2:为异步追加器刷新记录器缓冲区
【发布时间】:2016-12-07 14:11:21
【问题描述】:

我有 bufferSize="512" 的异步附加程序。

在某些情况下,我需要强制刷新缓冲区。我该怎么做?

我不会关闭 LogManager,所以LogManager.shutdown(); 不是一个选项。

请帮忙!

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

 <Kafka name="Kafka" topic="logs-gexd-default">
    <PatternLayout>
       <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}:%L - %m%n</pattern>
    </PatternLayout>
    <Property name="bootstrap.servers">${kafkaAddress}</Property>
 </Kafka>
 <Async name="AsyncKafka" bufferSize="512" blocking="false">
    <AppenderRef ref="Kafka"/>
 </Async>

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

【问题讨论】:

    标签: java logging log4j2


    【解决方案1】:

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

    您是否正在寻找一种方法来丢弃当前在队列中的所有事件?如果是这样,你能详细说明你的用例吗? (应用程序会简单地将更多 LogEvents 添加到队列中,所以我看不出丢弃排队事件有什么用......)


    cmets 后更新:

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

    【讨论】:

    • 我需要在某个时候停止 appender。当我做到这一点时,我看到记录器未能在最后一个缓冲区中发送数据。所以我想在停止之前冲洗它。
    • 你是如何停止 appender 的?还有,为什么需要停止appender而不关闭LogManager?
    • Kafka 和 Async appender 都有.stop() 方法。我不想关闭 LogManager,因为我有其他附加程序正在运行。而且我不想阻止他们。
    【解决方案2】:

    This answer 可能会解决您的问题...您只需要找到一个特定的附加程序而不是刷新所有附加程序。不过,在您的情况下,刷新消息可能并不理想......

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

    【讨论】:

    • 对于异步附加程序,请查看:logging.apache.org/log4j/2.x/manual/async.html。 “异步 Appender 已增强,可在批处理结束时(当队列为空时)刷新到磁盘。这产生与配置“immediateFlush=true”相同的结果,即所有接收到的日志事件始终在磁盘上可用” .这不完全是你要找的,但我认为你不能做得更好。至于卡夫卡,我不确定……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多