Springboot配置log4j2異步輸出日誌

強哥之前有發過一篇文章:聊一聊項目中的日誌配置,其中講述了項目log4j日誌配置文件中,通過修改一些參數實現日誌分期保存以及保存文件個數限制相關問題以及相應的處理方式。當然如果日誌量過大還是推薦項目中接入ELK將日誌放入搜索引擎中進行後期的查詢處理。

今天我們還是來講講日誌,不過,不是關於日誌的保存,而是關於在項目中遇到需要在程序中多處輸出日誌且每次的日誌量都很大時,我們可以如何處理來提高程序的性能。

當程序邏輯複雜需要輸出日誌的點很多時(用於排查問題);當程序多個點需要輸出日誌,且每個點輸出的日誌內容較大時;當應用用戶訪問量大、併發高導致日誌輸出非常快時;當QA壓測覺得你的程序性能較差時……

爲了提升我們程序的性能,同時兼顧日誌的輸出而不至於對業務邏輯有較大的影響,無疑,我們要做的就是將日誌的輸出從業務邏輯的中剝離出來,更準確的將應該是通過異步的方式,使得日誌輸出對業務影響降到最小,同時不影響我們必要的日誌的輸出和保存。

異步日誌輸出:

接下來我們也就簡單的講解一下,在Springboot項目中(使用log4j2),如何配置上全局的異步日誌以及如何驗證程序確實開啓了異步日誌輸出。

首先提一下爲什麼要使用log4j2吧,因爲在log4j版本中,異步輸出日誌的功能問題還比較多,性能上也差了許多,今天發的另一篇會展示兩者的差異。所以,在0202年當下,還是建議大家能夠將log4j升級到log4j2。當然,如果你使用的是logback日誌工具,它同樣也帶有開啓異步日誌輸出的方式,大家感興趣的可以自行百度。

其實Springboot配置log4j2異步輸出日誌方式比較簡單,有混合模式和全模式,官方也比較推薦使用全異步模式,最大提升性能。所以強哥這裏也就只提一下全異步模式的配置方式:

步驟一、添加依賴:

<dependency>
  <groupId>com.lmax</groupId>
  <artifactId>disruptor</artifactId>
  <version>3.4.2</version>
</dependency>

步驟二、修改啓動類或在項目啓動時語句中加入屬性參數:

修改啓動類:


@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
//下面語句使得日誌輸出使用異步處理,減小輸出日誌對性能的影響
        System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
        SpringApplication.run(TestApplication.class, args);
    }
}

 修改項目啓動語句:

java -jar -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector xxx.jar

兩種方式選擇一種就行。按個人喜好處理。

沒錯,就上面簡單的兩步就能實現在項目啓動後,異步日誌的功能。當然,有的人可能還會問:配置是配置上了,可是到底是不是真的實現異步日誌輸出了呢?要怎麼驗證呢?

這裏,我們可以通過查看項目啓動後的線程名來檢查是否真的配置成功了。下面是強哥在啓動項目後,項目中的線程情況截圖:

可以看到,有兩個線程是關於Log4j2的,其中上面紅框中的Log4j2-TF-AsyncLogger就是異步日誌輸出線程。看到它說明我們的配置是成功的。如果還是不確定,可以Debug模式運行項目,選擇該線程,ide會進入到該線程查看程序到達該線程的一系列的操作,由此便可以知道成功配置了異步日誌輸出功能。

好了,上面便是Springboot實現log4j2異步輸出日誌的相關實現。其實內容相對簡單,但是強哥更希望傳遞的是當大家遇到問題的時候,能夠想到相應的解決方式,對於項目中與業務邏輯並非必要但是卻影響性能的地方,完全可以通過異步或拆分的方式來保證性能。

這裏沒有講解過多的原理,只是因爲網上相應的原理說明確實太多,但是如何配置實現卻都含糊不清,大家對原理等有興趣也可以自己多去了解,這裏只做拋磚引玉的作用啦,只希望大家遇到日誌相關的瓶頸時,可以想到此解決方式。

關注公衆號獲取更多內容,有問題也可在公衆號提問哦:

強哥叨逼叨

叨逼叨編程、互聯網的見解和新鮮事

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章