【问题标题】:Difference between AsyncLogger and AsyncAppender in Log4j2Log4j2 中 AsyncLogger 和 AsyncAppender 的区别
【发布时间】:2014-08-02 09:02:53
【问题描述】:

我了解 AsyncAppender 在单独的线程中执行附加工作。他们为此使用 ArrayBlockingQueue。

AsyncLogger 使用 LMAX 中断库将日志记录事件从一个应用程序线程移动到另一个线程,与 AsyncAppender 相比,它更快。

我的问题是,如果 AsyncLogger 更有效地完成工作,为什么我们在 log4j2 中有 AsyncAppender。

如果我们将 AsyncAppender 与 AsyncLogger 一起使用会怎样? AsyncLogger 和 AsyncAppender 还有什么区别吗?

【问题讨论】:

    标签: java multithreading logging log4j log4j2


    【解决方案1】:

    没错,它们的目的几乎相同,所以我可以理解您的问题:“为什么有两种选择”?

    作为背景,AsyncAppender 从一开始就在 Log4j2 中,去年 3 月(2014 年)添加了 Async Loggers。这就是现在的情况。

    log4j 团队目前并未认真考虑移除 AsyncAppender。要记住的一件事是,Async Loggers 有一个外部依赖项(LMAX 中断器 jar),其中 AsyncAppender 仅与 log4j2-api 和 log4j2-core jar 一起工作。

    要回答您的最后一个问题,可以将 AsyncAppender 与 Async Loggers 结合使用,但您不会有任何收获。这尚未经过测试。我还没有检查,但是在将日志事件从 Async Logger 线程移交给 AsyncAppender 线程时,位置信息可能会丢失。我不建议这样做。

    更新(2014 年 6 月 23 日):我做了一些测试,将 AsyncAppender 与 AsyncLoggers 结合使用时存在一些问题。这些在 RC2 中是固定的。我仍然不建议这样做,因为它只是添加了另一个中间步骤,它使用 CPU/内存而没有任何贡献。

    更新 (2016/7/20):另一个区别:从 2.6 版开始,Log4j 2 可以使用 Async Loggers 实现无垃圾,但不能使用 AsyncAppender。


    在下面的 cmets 中回答您的第二个问题:AsyncAppender 有自己的队列和线程,其中 AsyncLoggers 使用 LMAX Disruptor ringbuffer 作为队列并使用 Executor 线程。

    【讨论】:

    • 感谢 Remko。我知道对于异步记录器,您需要中断器 jar。AsyncAppender 在单独的线程中执行异步记录器的附加方法。AsyncLogger 是否也在单独的线程中执行附加方法或其他不同的方法。请澄​​清跨度>
    【解决方案2】:

    没有从已接受的答案中删除任何内容,但请查看https://logging.apache.org/log4j/2.x/manual/async.html。 该页面包含 log4j2 团队进行的性能测量,其中异步记录器的性能优于异步附加器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多