大家好,之前寫(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 或者客戶指定的技術。
以上是個人觀點,如果有問題或錯誤,歡迎留言討論指正,碼字不易,如果覺得寫的不錯,求關注、求點贊、求轉發。
掃碼關注公眾號,第一時間獲得更新
