Java日志體系
- Java日志架構演變史
-
- Log4j
- JUL(jdk-logging)
- JCL(commons-logging)
- Slf4j
- Logback
- Log4j2
- 日志分類
-
- 接口類 門面型日志架構
- 實作類 記錄型日志架構
- 橋接類
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 來實作日志功能。
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