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

AsyncLogger使用LMAX破坏程序库将日志记录事件从一个应用程序线程移动到另一个线程,并且与AsyncAppender相比,它更快。
我的问题是,如果AsyncLogger更有效地完成了工作,为什么我们在log4j2中拥有AsyncAppender。
如果我们将AsyncAppender和AsyncLogger一起使用怎么办? AsyncLogger和AsyncAppender之间还有其他区别吗?

最佳答案

没错,它们几乎达到了相同的目的,因此我可以理解您的问题:“为什么有两个选择”?

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

log4j团队目前并未认真考虑删除AsyncAppender。要记住的一件事是,异步记录器具有外部依赖性(LMAX破坏器jar),其中AsyncAppender仅与log4j2-api和log4j2核心jar一起工作。

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

更新(2014/6/23):我进行了一些测试,将AsyncAppender与AsyncLoggers结合使用存在一些问题。这些已在RC2中修复。我仍然不建议这样做,因为它只是增加了另一个中间步骤,该步骤使用CPU/内存而无任何贡献。

更新(2016/7/20):另一个区别:自2.6版以来,Log4j 2可以使用Async Loggers进行无垃圾操作,但不能使用AsyncAppender。

在下面的评论中回答您的第二个问题:AsyncAppender有自己的队列和线程,其中AsyncLogger使用LMAX Disruptor环形缓冲区作为队列,并使用Executor线程。

09-16 00:33