log4j2通過將打日志流程中的部分階段進(jìn)行異步化,使得日志打印性能得到了很大的提升。
要想了解log4j如果實(shí)現(xiàn)異步日志,進(jìn)而提升性能,就需要先了解日志打印的基本過程。
關(guān)鍵概念
在log4j中,有兩個重要的概念,分別是Logger、Appender。Logger是負(fù)責(zé)具體的生產(chǎn)日志數(shù)據(jù),我們平時的Logger.info(...)就是生產(chǎn)日志數(shù)據(jù)的過程。Appender則是負(fù)責(zé)講數(shù)據(jù)搬運(yùn)到目的地,如console、文件、hive、網(wǎng)絡(luò)設(shè)備等等。
日志流程

而log42實(shí)現(xiàn)異步日志,主要包括以下兩種方式:
異步Logger
異步Logger通過使用LMAX Disruptor環(huán)形隊列和單獨(dú)的處理線程,避免了鎖的競爭,從而實(shí)現(xiàn)更高的吞吐量。隊列大小默認(rèn)4096,通過以下參數(shù),可以開啟異步日志。
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
異步Appender
異步Appender則是使用了java中的ArrayBlockingQueue,默認(rèn)隊列大小1024。log4j2官方測試,asyncLogger相比asyncAppender有更好的表現(xiàn)。

題外
是否可以同時使用AsyncLogger + AsyncAppender?同時使用是否有更好表現(xiàn)?
據(jù)stackoverflow上回答,AsyncLogger是更新的異步機(jī)制,有更好的表現(xiàn)。AsyncAppender是之前的異步機(jī)制。同時使用也不會增加性能表現(xiàn)。見
https://stackoverflow.com/questions/24177601/difference-between-asynclogger-and-asyncappender-in-log4j2
參考資料
https://logging.apache.org/log4j/2.x/manual/async.html
https://www.cnblogs.com/yeyang/p/7944906.html
https://bryantchang.github.io/2019/01/15/log4j2-asyncLogger/