Log4j2 中的 AsyncLogger 和 AsyncAppender 之间的区别

2022-09-01 17:29:56

我理解AsyncAppender在单独的线程中执行追加作业。他们使用ArrayBlockingQueue来实现此目的。

AsyncLogger 使用 LMAX 干扰程序库将日志记录事件从一个应用程序线程移动到另一个线程,并且与 AsyncAppender 相比,它的速度更快。

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

如果我们将AsyncAppender与AsyncLogger一起使用怎么办?AsyncLogger 和 AsyncAppender 之间还有区别吗?


答案 1

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

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

log4j团队目前没有认真考虑删除AsyncAppender。要记住的一件事是,Async Loggers有一个外部依赖关系(LMAX干扰器jar),其中AsyncAppender只与log4j2-api和log4j2-core jar一起工作。

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

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

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


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


答案 2

不要从接受的答案中拿走任何东西,但看看 https://logging.apache.org/log4j/2.x/manual/async.html。该页面包括log4j2团队进行的性能测量,其中异步记录器的性能优于异步追加器相当一定。