Java日誌框架演化歷史

ldzsl發表於2021-09-09

專案中有一堆日誌相關的Jar包,到底應該引入哪些?排除哪些?哪些與哪些互相沖突?哪些與哪些又是相互依賴的?這類問題有時候容易讓人崩潰!

本文目的就是要理清Java眾多日誌包的關係,明白如何進行日誌轉換。對於不同日誌類的配置和使用方式,不在本文涉及範圍之內。

日誌相關Jar包分類

首先我們可以對眾多的日誌相關Jar包進行分類,主要分為三類:

介面類:只提供API定義,沒有提供具體實現。目的是為應用層提供標準化的使用方式。既所謂的面向介面程式設計

  • SLF4J
  • J.C.L(commons-logging)

實現類:具體的日誌實現類,提供對日誌的收集/管理功能。受不同需求/不同歷史環境影響,各框架功能上有許多不同。但遵循進化論規律

  • Log4j
  • J.U.L(jdk-logging)
  • 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

Java日誌框架發展歷史

下面我們按照他們出現的先後循序和歷史背景,來進行梳理。

Log4j

圖片描述
Apache基金會最早實現的一套日誌框架,在Java1.4之前只有這一種選擇。誰能想到Java1.4之前,JDK都沒有內建的日誌功能!

J.U.L(jdk-logging)

圖片描述
終於在2002年Java1.4釋出,Sun推出了自己的日誌庫J.U.L(jdk-logging)。但基本上是模仿Log4j的實現。有點兒雞肋,但最起碼解決了有無的問題。從此開發者有了兩種選擇。

J.C.L(commons-logging)

圖片描述
因為有了兩種選擇,所以導致了日誌使用的混亂。所以Apache推出了J.C.L(commons-logging)。它只是定義了一套日誌介面,支援執行時動態載入日誌元件。應用層編寫程式碼時,只需要使用J.C.L提供的統一介面來記錄日誌,在程式執行時會優先找系統是否整合Log4j,如果整合則使用Log4j做為日誌實現,如果沒找到則使用J.U.L做為日誌實現。J.C.L的出現解決了多種日誌框架共存的尷尬,也是面向介面程式設計思想的一種具體體現。

Slf4j

圖片描述
2006年,Log4j的作者Ceki Gülcü離開Apache後,又搞出來一套類似J.C.L的介面類,就是Slf4j。原因是作者覺得J.C.L這套介面設計的不好,容易讓開發者寫出有效能問題的程式碼。Slf4j做為一套標準介面,可以實現無縫與多種實現框架進行對接。它也是現在比較常用的日誌整合方式。

Logback

圖片描述
在搞出來Slf4j之後,Ceki Gülcü又順帶開發了Logback,做為Slf4j的預設實現。在功能完整度和效能上,Logback超越了所有已有的日誌實現框架。

Log4j2

圖片描述
2012年,Apache重寫了Log4j,實現了Log4j2。在功能上面具有Logback的所有特性。算是目前功能最完善的日誌框架。

透過上面的介紹,我們已經知道一共有2個日誌介面標準和4個具體的實現。那一個專案中如果出現多種日誌框架,我們改怎麼進行統一呢?

為此,各開源組織為我們提供了一堆的日誌橋接類。下面我們透過一張轉換圖,來了解一下各種日誌框架的轉換關係。

圖片描述

圖上列舉出了多種日誌實現框架轉換成Slf4j介面和Slf4j介面繫結多種日誌實現框架所涉及到的相關Jar包。透過這些橋接包,我們可以輕鬆實現專案中日誌框架的統一。對於哪些包需要引入/哪些包需要排除也就一目瞭然了。

透過這種尋根溯源的方式來學習,不僅能夠弄明白每種技術出現的背景/需要應對的場景,還能夠理清整體的脈絡,從全域性上把握技術方向。當然也能夠加深對技術的理解程度。

宣告:圖片來源於網路,如有侵權,請聯絡刪除。


歡迎關注課程:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2325/viewspace-2823823/,如需轉載,請註明出處,否則將追究法律責任。

相關文章