我理解AsyncAppender在单独的线程中执行附加作业。他们为此目的使用ArrayBlockingQueue。
和
AsyncLogger使用LMAX disruptor库将日志记录事件从一个应用程序线程移动到另一个线程,并且它与AsyncAppender一起更快。
我的问题是为什么我们在log4j2中有AsyncAppender,如果它所做的工作是由AsyncLogger更有效地实现的。
如果我们将AsyncAppender与AsyncLogger一起使用怎么办? AsyncLogger和AsyncAppender之间是否还有其他差异?
答案 0 :(得分:19)
是的,他们达到了几乎相同的目的,所以我可以理解你的问题:"为什么有这两个选项"?
对于后台,AsyncAppender从一开始就在Log4j2中,去年三月(2014年)添加了异步记录器。那是当前形势的结果。
log4j团队目前还没有认真考虑删除AsyncAppender。要记住的一件事是Async Loggers有一个外部依赖(LMAX disruptor jar),其中AsyncAppender只使用log4j2-api和log4j2-core jar。
要回答您的上一个问题,可以将AsyncAppender与Async Loggers结合使用,但您无法获得任何收益。这尚未经过测试。我还没有检查过,但是当将日志事件从Async Logger线程移交给AsyncAppender线程时,可能会出现位置信息丢失的问题。我不建议这样做。
UPDATE(2014/6/23):我做了一些测试,将AsyncAppender与AsyncLoggers结合起来存在一些问题。这些是在RC2中修复的。我仍然不建议这样做,因为它只是添加了另一个使用CPU /内存而没有贡献的中间步骤。
更新(2016/7/20):另一个区别:从版本2.6开始,Log4j 2可以使用Async Logger无垃圾,但不能使用AsyncAppender。
回答下面评论中的第二个问题:AsyncAppender有自己的队列和线程,其中AsyncLoggers使用LMAX Disruptor ringbuffer作为队列并使用Executor线程。
答案 1 :(得分:5)
不接受接受的答案,但请查看https://logging.apache.org/log4j/2.x/manual/async.html。 该页面包括log4j2团队进行的性能测量,异步记录器在很大程度上优于异步追踪器。