天天看點

Java日志體系(一) 演變史、分類Java日志架構演變史日志分類

Java日志體系

  • Java日志架構演變史
    • Log4j
    • JUL(jdk-logging)
    • JCL(commons-logging)
    • Slf4j
    • Logback
    • Log4j2
  • 日志分類
    • 接口類 門面型日志架構
    • 實作類 記錄型日志架構
    • 橋接類

Java日志架構演變史

Java日志體系(一) 演變史、分類Java日志架構演變史日志分類

Log4j

Apache基金會最早實作的一套日志架構,在Java1.4之前隻有這一種選擇。誰能想到Java1.4之前,JDK都沒有内置的日志功能!。

JUL(jdk-logging)

在2002年Java1.4釋出,Sun推出了自己的日志庫J.U.L(jdk-logging)。但基本上是模仿Log4j的實作。

JCL(commons-logging)

JUL 畢竟是 JDK 自帶的,也有很多人用。同時還有其他日志元件,如 SimpleLog 等。這時如果有人想換成其他日志元件,如 log4j 換成 JUL,因為 API 完全不同,就需要改動代碼。

為了将日志接口與實作解耦,Apache 推出了 JCL 即 Apache Commons Logging。JCL 隻定義了一套日志接口,具體實作由 log4j 或 JUL 來完成。JCL 基于動态綁定來實作日志的記錄,在使用時隻需要用 JCL 定義的接口來編寫代碼即可,程式真正運作時會檢查 classpath 中的具體實作,是以可以自由選擇是由 log4j 還是 JUL 來實作日志功能。

Java日志體系(一) 演變史、分類Java日志架構演變史日志分類

Slf4j

2006年,Log4j的作者Ceki Gülcü離開Apache後,又搞出來一套類似J.C.L的接口類,就是Slf4j。原因是作者覺得J.C.L這套接口設計的不好,容易讓開發者寫出有性能問題的代碼。Slf4j做為一套标準接口,可以實作無縫與多種實作架構進行對接。它也是現在比較常用的日志內建方式。

Logback

在搞出來Slf4j之後,Ceki Gülcü又順帶開發了Logback,做為Slf4j的預設實作。在功能完整度和性能上,Logback超越了所有已有的日志實作架構。

Logback是log4j的更新版,目前分為三個目标子產品:

  • logback-core:核心子產品,是其它兩個子產品的基礎子產品
  • logback-classic:是log4j的一個改良版本,同時完整實作 SLF4J API 使你可以很友善地更換成其它日記系統如log4j 或 JDK14 Logging
  • logback-access:通路子產品與Servlet容器內建提供通過Http來通路日記的功能,是logback不可或缺的組成部分

Logback相較于log4j有更多的優點:

  • 更快的執行速度
  • 更充分的測試
  • logback-classic 非常自然的實作了SLF4J
  • 使用XML配置檔案或者Groovy
  • 自動重新載入配置檔案
  • 優雅地從I/O錯誤中恢複
  • 自動清除舊的日志歸檔檔案
  • 自動壓縮歸檔日志檔案
  • 謹慎模式
  • Lilith
  • 配置檔案中的條件處理
  • 更豐富的過濾

Log4j2

2012年,Apache重寫了Log4j,實作了Log4j2。在功能上面具有Logback的所有特性。算是目前功能最完善的日志架構。

日志分類

接口類 門面型日志架構

隻提供API定義,沒有提供具體實作。目的是為應用層提供标準化的使用方式。既所謂的面向接口程式設計。SLF4J、JCL

實作類 記錄型日志架構

具體的日志實作類,提供對日志的收集/管理功能。Log4j、JUL、Log4j2、Logback

橋接類

多種日志實作架構混用情況下,需要借助橋接類進行日志的轉換,最後統一成一種進行輸出。

slf4j-jdk14、slf4j-log4j12、log4j-slf4j-impl、logback-classic、slf4j-jcl、jul-to-slf4j、log4j-over-slf4j、icl-over-slf4j、log4j-to-slf4j

繼續閱讀