一岸蜗、log4j2異步類型
1) 使用<Async>標(biāo)簽
示例:
<Async name="asyncKafkaLog">
<AppenderRef ref="Failover" />
</Async>
注意事項(xiàng): 此類異步隊(duì)列是BockingQueue,隊(duì)列默認(rèn)大小是128
2) 使用<AsyncLogger>標(biāo)簽
示例:
<AsyncLogger name="kafkaLogger" level="trace" includeLocation="false">
<AppenderRef ref="Failover"/>
</AsyncLogger>
注意事項(xiàng): 此類異步隊(duì)列是Disruptor隊(duì)列默認(rèn)大小是4096
3) 使用 JVM參數(shù)
示例:
#啟動參數(shù)方式
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
#代碼方式
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
注意事項(xiàng): 此類異步是全量異步护侮,log4j配置文件里所有l(wèi)ogger都自動異步颜矿,使用異步隊(duì)列為Disruptor告丢,隊(duì)列默認(rèn)大小4096
二衍腥、小提示:
① Disruptor隊(duì)列性能遠(yuǎn)勝于BlockingQueue蚪缀,這也是log4j2性能提升的重要原因之一
② 如果啟用了全量異步疹启,又使用了<AsyncLogger>會如何林说?
log4j2會新建兩個(gè)Disruptor隊(duì)列煎殷,<AsyncLogger>之流使用一個(gè),其他的使用另外一個(gè)述么,所以建議將可能發(fā)生阻塞的logger歸類使用一個(gè)Disruptor蝌数,畢竟是隊(duì)列愕掏,一個(gè)阻塞了其他的得乖乖等著
③ 如果默認(rèn)隊(duì)列長度不足咋辦度秘?
#第一步:加大兩個(gè)Disruptor隊(duì)列的長度
-DAsyncLogger.RingBufferSize=262144
-DAsyncLoggerConfig.RingBufferSize=262144
#第二步:設(shè)置隊(duì)列滿了時(shí)的處理策略:丟棄,否則默認(rèn)blocking饵撑,異步就與同步無異了
-Dlog4j2.AsyncQueueFullPolicy=Discard