一、log4j2异步类型
1) 使用<Async>标签
示例:
<Async name="asyncKafkaLog">
<AppenderRef ref="Failover" />
</Async>
注意事项: 此类异步队列是BockingQueue,队列默认大小是128
2) 使用<AsyncLogger>标签
示例:
<AsyncLogger name="kafkaLogger" level="trace" includeLocation="false">
<AppenderRef ref="Failover"/>
</AsyncLogger>
注意事项: 此类异步队列是Disruptor队列默认大小是4096
3) 使用 JVM参数
示例:
#启动参数方式
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
#代码方式
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
注意事项: 此类异步是全量异步,log4j配置文件里所有logger都自动异步,使用异步队列为Disruptor,队列默认大小4096
二、小提示:
① Disruptor队列性能远胜于BlockingQueue,这也是log4j2性能提升的重要原因之一
② 如果启用了全量异步,又使用了<AsyncLogger>会如何?
log4j2会新建两个Disruptor队列,<AsyncLogger>之流使用一个,其他的使用另外一个,所以建议将可能发生阻塞的logger归类使用一个Disruptor,毕竟是队列,一个阻塞了其他的得乖乖等着
③ 如果默认队列长度不足咋办?
#第一步:加大两个Disruptor队列的长度
-DAsyncLogger.RingBufferSize=262144
-DAsyncLoggerConfig.RingBufferSize=262144
#第二步:设置队列满了时的处理策略:丢弃,否则默认blocking,异步就与同步无异了
-Dlog4j2.AsyncQueueFullPolicy=Discard