1. 程式人生 > >2020 年了,Java 日誌框架到底哪個效能好?——技術選型篇

2020 年了,Java 日誌框架到底哪個效能好?——技術選型篇

大家好,之前寫(shui)了兩篇其他型別的文章,感覺大家反響不是很好,於是我乖乖的回來更新硬核技術文了。

經過本系列前兩篇文章我們瞭解到日誌框架大戰隨著 SLF4j 的一統天下而落下帷幕,但 SLF4j 僅僅是介面,實現方面, logback 與 log4j2 仍然難分高下,今天我們就來聊一聊,日誌框架實現到底是該選擇 Log4j2 還是 Logback。這篇文章我們將從功能、API 設計、可擴充套件性、效能四個方面展開討論。

生態

老牌的 Log4j2 憑藉著入場早、背靠 Apache 兩大優勢有著不錯的使用者支援,官網文件也很完善。

新生的 Logback 憑藉著 SLF4j 的原生實現以及被 Spring Boot 欽點的日誌框架(Spring 也提供了Log4j2 的 starter,切換依賴即可完成更換日誌框架,前文講過,此處不再贅述),同樣也擁有著很好的前景。

社群支援方面,Log4j2 作為 Apache 頂級專案,支援度應該是很不錯的,Logback 作為Ceki創業後的產物,也能有很好的保證,二者生態可謂不相上下。

功能

日誌的功能我們從使用者的角度可以分為:配置、使用、以及獨有特性。

  • 配置檔案方面,Log4j 提供了更多的配置檔案配置方式,Log4j2 支援 properties、YAML、JSON、XML四種,Logback 則支援 XML 與 groovy 兩種方式;
  • Appender 方面,兩者均支援自定義擴充套件 Appender ,Log4j2 並且提供了幾乎全部場景的 Appender,檔案、控制檯、JDBC、NoSql、MQ、Syslog、Socket、SMTP等,Logback提供 Appender 略少於 Log4j2,提供了檔案、控制檯、資料庫、Syslog、Socket、SMTP等,動態化輸出方面,Log4j2 提供了ScriptAppenderSelector,Logback 則提供了 Evaluator 與 SiftingAppender(兩者均可以用於判斷並選擇對應的 Appender);
  • 獨有特性方面,Logback 支援 Receivers, 可以接收其他 Logback 的 Socket Appender 輸出,Logbak 還擁有 logback-access 模組,可以用來與 Servlet容器(如 Tomcat 和 Jetty)整合,提供 http 訪問日誌功能;Log4j2 則擁有號稱能夠減少 JVM 垃圾回收停頓時間的 Garbage-free(無垃圾模式),Log4j2 API 支援使用 Java 8 lambda,SLF4j 則在 2.0 版本提供流式(Fluent)API 同時支援 lambda;

API 設計及可擴充套件性

如前文所說,SLF4j 則在 2.0 版本提供流式(Fluent)API ,屆時Logback將會原生實現(理論上會比動態轉譯過去要好),而 Log4j2 並沒有提供支援。擴充套件方面,Logback 採用配置檔案中直接寫對應實現(class="ch.qos.logback.core.rolling.RollingFileAppender"

)來自定義實現擴充套件,Log4j2 採用外掛機制,無需配置,但比較複雜,個人認為 Logback 反而清晰一些。

效能

效能方面,Log4j2 官網有很好的效能測試報告,結果是 Log4j2 完勝,本著嚴謹的態度,員外認為還要自己來測試一下,使用了 JMH 進行同步和非同步輸出檔案測試,測試一分鐘,無預熱,採用檔案滾動模式,gzip壓縮,總計輸出(gzip壓縮後) 700~900 MB 左右,測試版本: # logback 1.2.3,# log4j 2.13.0,# SLf4j 1.7.30,# JMH version: 1.22 # JDK 1.8.0_232,測試過程中二者都使用了SLF4j 作為 API 輸出日誌。

日誌輸出格式:

  • logback:%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40.40logger{39} : %m%n

  • Log4j2:%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40.40c{1.} : %m%n

測試結結果:

從測試結果來看二者差異並不大,吞吐量表現上,同步輸出在單執行緒上要好於非同步輸出,非同步輸出方面,Log4j2 要優於Logback;響應時間表現上,二者無論同步、非同步差距都不大,並且都表現為執行緒越多響應越慢,應該是執行緒切換和加鎖開銷所致,值得一提的是,非同步輸出時 CPU 使用率會更高一點。

總結

Logback 使用更簡單、Log4j2 功能更強大,如果不是深度使用,兩者並不會有太大差別,並且在使用SLF4j的時候可以無縫切換。個人建議,不必糾結選型,按照偏好選擇即可。測試原始碼已上傳 github,下一篇我們來講解原理以及如何擴充套件動態調整日誌輸出級別。

Java 程式設計師十分“幸運”的不需要做技術選型:初級程式設計師沒能力選型,中級程式設計師經常使用已經選擇好的技術,高階程式設計師只能選擇 CTO 或者客戶指定的技術。

以上是個人觀點,如果有問題或錯誤,歡迎留言討論指正,碼字不易,如果覺得寫的不錯,求關注、求點贊、求轉發。

掃碼關注公眾號,第一時間獲得更新