没错,它们实现了几乎相同的目的,所以我可以理解你的问题:“为什么两种选择都有”?
作为背景,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线程。