Log4j2中Asynclogger和AsyncAppender之间的区别

sau*_*yal 22 java logging multithreading log4j log4j2

我知道AsyncAppender在一个单独的线程中执行附加作业.他们为此目的使用ArrayBlockingQueue.

AsyncLogger使用LMAX disruptor库将日志记录事件从一个应用程序线程移动到另一个线程,并且它与AsyncAppender一起更快.

我的问题是为什么我们在log4j2中有AsyncAppender,如果它所做的工作是由AsyncLogger更有效地实现的.

如果我们将AsyncAppender与AsyncLogger一起使用怎么办?AsyncLogger和AsyncAppender之间是否还有其他差异?

Rem*_*pma 23

没错,他们实现了几乎相同的目的,所以我能理解你的问题:"为什么有这两个选择"?

对于后台,AsyncAppender从一开始就在Log4j2中,去年三月(2014年)增加了异步记录器.这就是现在的情况.

log4j团队目前还没有认真考虑删除AsyncAppender.要记住的一件事是Async Loggers有一个外部依赖(LMAX disruptor jar),AsyncAppender只使用log4j2-api和log4j2-core jar.

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

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

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


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


ftr*_*ftr 7

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