log4j性能配置

使用日誌可能會讓你的應用性能降低20% —— 很難相信吧,可是倒是真的可能。java

本文討論一些儘量提高日誌性能的方法,

2 關鍵設置緩存

這裏經過Junit,使用不一樣的Log4j配置來測試。下面會展現測試結果。實際上影響log4j性能的最主要因素有三:網絡

  1. immediateFlush
  2. bufferedIO
  3. asycAppender

測試的結果可能和你想的不同。好比,使用asyncAppender會下降本地日誌文件的寫入性能;bufferedIO不怎麼樣影響性能除非日誌特別多;immediateFlush設爲false幾乎可使寫入時間減半。怎麼回事呢?咱們來看!異步



3 就是緩存async

上面三個都是使用緩存,他們分三級。第一級, immediateFlush=false 會開啓 java.io.Writer/java.io.OutputStreamWriter 的緩存,消息到達後會緩存最長1024字節。第二級 bufferedIO=true 會把 java.io.Writer 包裝成 java.io.BufferedWriter ,緩存默認大小是 1024*8 字節。第三級是 asyncAppender ,會緩存Log4j事件,默認是128條。

通常地,輸出流在使用的時候其餘寫入會被阻塞。使用緩存後能夠減小這種阻塞。可是若是原本就沒有阻塞(好比在寫入本地日誌的時候),使用緩存反而會延遲寫入。這樣講的話,使用緩存反而沒提高性能。因此性能調優要看狀況:你使用的是本地日誌仍是遠程日誌,什麼會形成資源競爭。性能



4 測試結果測試

這個測試很簡單,使用log4j輸出2560行,看看不一樣的配置使用的時間如何。咱們考察上面的三個因素:

 

每一個相同的測試咱們跑了三次。前三行結果是log4j的默認配置:同步+無緩存+當即刷入。第一條結果是157毫秒,咱們忽略它,由於它和後兩條(63毫秒,62毫秒)差距太大。

接下來三行 (63, 63, 62 milliseconds) 開啓了緩存可是仍是當即刷入。你可能想到這沒用,當即刷入讓緩存無用武之地。因此結果和前面一致仍是60多毫秒。

而後咱們看開啓緩存後不當即刷入,也就是 immediateFlush=false,結果是(31, 32, 31 milliseconds)。差很少是前面的一半,好厲害!

若是關閉緩存不當即刷入呢?這個和上面結果同樣。

接下來看異步日誌。咱們關閉緩存而且當即刷入,結果是 (78, 78, 94 milliseconds)。異步日誌沒有改善性能,反而下降了咱們的性能。

最後,咱們使用異步日誌結合緩存打開、不當即刷入,結果是 (63, 47, 47 milliseconds) ,依然沒有同步的效果好。

恩?咋回事呢?spa


5 總結3d

Log4j性能建議
本地日誌:
  1. 要速度快就關閉當即寫入,緩存使用默認。缺點是系統崩潰的時候緩存裏面沒寫入文件的消息都丟失了。
  2. 別使用asycAppender,它實際上比同步用的時間長。由於沒阻塞的時候異步邏輯比同步邏輯複雜時間更長。
遠程日誌:
  1. 使用asyncAppender。只有異步隊列滿了纔會開啓和關閉一次網絡鏈接。
  2. 使用緩存bufferedIO ,它會把Writer 包裝成BufferedWriter .
注意:
  1. 若是日誌帶來的性能降低不嚴重,就不要調優。調優反而會帶來其餘問題。
  2. 日誌配置文件修改後通常不用重啓就能生效。
  3. 改用遠程日誌的時候必定要作性能測試。
調試的時候:
  1. 使用log4j默認設置。
  2. 開啓緩存的時候使用tail -f 這樣的命令讀不到緩存中沒寫入的消息。
相關文章
相關標籤/搜索