Log4j2介紹和特性例項(三)--日誌的非同步輸出
阿新 • • 發佈:2019-01-03
上一篇介紹了一個Log4j2的使用例項,本編將介紹Log4j2的一個重要特性,日誌非同步輸出。
日誌非同步輸出的好處在於,使用單獨的程序來執行日誌列印的功能,可以提高日誌執行效率,減少日誌功能對正常業務的影響。
非同步日誌在程式的classpath需要載入disruptor-3.0.0.jar或者更高的版本。
非同步日誌分為兩種:
a.全非同步模式
這種非同步日誌方式,不需要修改修改原理的配置檔案,Logger仍然使用<root> and <logger>
只需要在主程式程式碼開頭,加一句系統屬性的程式碼:
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
b.非同步和非非同步混合輸出模式
在配置檔案中Logger使用<asyncRoot> or <asyncLogger>
<loggers> <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true"> <appender-ref ref="Console" /> <appender-ref ref="debugLog" /> <appender-ref ref="errorLog" /> </AsyncLogger> <asyncRoot level="trace" includeLocation="true"> <appender-ref ref="Console" /> </asyncRoot> </loggers>
使用者手冊中說全非同步模式的效能要高於混合非同步模式,但是如果Log4j2用作審計功能(Audit)的話,建議使用混合非同步模式。
在異常導致程式退出的情況,擔心Log4j2非同步輸出無法列印錯誤資訊,也專門做了測試。
從測試結果看,在程式異常退出前的所有日誌都得到了儲存。3,000,000條日誌,全非同步模式(All Logger Async)用了20分鐘列印到日誌檔案,混合模式(Mixing)用了40分鐘。
另外,Log4j2實現高效能的非同步日誌輸出,主要是藉助了LMAX Disruptor的開源框架,下面是Log4j2對其的描述,感興趣的同學可以自己學習一下。
LMAX Disruptor technology. Asynchronous Loggers internally use the Disruptor, a lock-free inter-thread communication library, instead of queues, resulting in higher throughput and lower latency.下一篇將介紹日誌的過濾器。