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

你們好,以前寫(shui)了兩篇其餘類型的文章,感受你們反響不是很好,因而我乖乖的回來更新硬核技術文了。git

通過本系列前兩篇文章咱們瞭解到日誌框架大戰隨着 SLF4j 的一統天下而落下帷幕,但 SLF4j 僅僅是接口,實現方面, logback 與 log4j2 仍然難分高下,今天咱們就來聊一聊,日誌框架實現究竟是該選擇 Log4j2 仍是 Logback。這篇文章咱們將從功能、API 設計、可擴展性、性能四個方面展開討論。程序員

生態

老牌的 Log4j2 憑藉着入場早、背靠 Apache 兩大優點有着不錯的用戶支持,官網文檔也很完善。github

新生的 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 輸出日誌。測試

日誌輸出格式:ui

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

  • 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 或者客戶指定的技術。

以上是我的觀點,若是有問題或錯誤,歡迎留言討論指正,碼字不易,若是以爲寫的不錯,求關注、求點贊、求轉發

掃碼關注公衆號,第一時間得到更新

代碼:https://github.com/jiyuanwai/log-benchmark/tree/master

相關文章
相關標籤/搜索