1. 程式人生 > >Log4j2介紹和特性例項(三)--日誌的非同步輸出

Log4j2介紹和特性例項(三)--日誌的非同步輸出

上一篇介紹了一個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.

下一篇將介紹日誌的過濾器。