【Java雜記】日誌:Java日誌體系,從應用場景到發展歷史

A minor發表於2020-12-12

在實際應用中,日誌是最重要的一個元件。它可以為系統提供錯誤以及日常的定位,也可以對訪問的記錄進行跟蹤。當然,在很多大型的網際網路應用中,基於日誌的收集以及分析可以瞭解使用者的使用者畫像,比如興趣愛好、點選行為。

1.日誌框架應用場景

某專案開發人員張三,為了瞭解專案執行情況,在我們程式碼中加入了 System.out.println("*****") 來記錄日誌。

有一天,專案經理覺得通過這種 System.out.println("*****") 的方式很撈,要他把程式碼中的,System.out.println給去掉,但是過了幾天之後,專案出問題了,查詢很棘手又沒有日誌,所以經理又要求他把 System.out.println 加上。。。。。。。。然後又去掉。。。。。又加上。。。。。。

所以張三為了解決 System.out.println("****") 比較撈的情況,就寫了一個記錄日誌的 jar 包名稱叫 zs-logging.jar 用來替代 System.out.println("*****")。

因為張三是一個愛專研的人,後來又想出了一寫比較牛的點子。比如日誌非同步記錄,日誌歸檔。。。給它起名叫 zs-logging-good.jar,然後把專案中原來的 zs-logging.jar 卸下來安裝新的框架 zs-logging-good.jar。

但是由於二種方式實現的介面可能不一樣,需要修改程式碼中的日誌列印類。這種情況這麼辦?

此時張三想到了一個好辦法,我把 zs-logging.jar 和 zs-logging-good.jar 的功能都抽取出來形成一個門面 zs-logging-intf.jar(也就是我們的介面),然後在兩個日誌框架中實現不同的功能。這樣我的業務程式碼中直接使用的就是 zs-logging-intf.jar 的方法,最後再根據需要匯入zs-logging.jar 或者 zs-logging-good.jar。

2.常見的日誌框架

可能是太過於常見了,所以使得大家很少關注,只是要用到的時候複製貼上一份就行,甚至連日誌配置檔案中的配置語法都不清楚。另外一方面,Java 中提供的日誌元件太多了,一會兒log4j,一會兒logback,一會兒又是log4j2,不清楚其中的關聯。

Java 中常用的日誌框架: Log4j、Log4j 2、Commons Logging、Slf4j、Logback、Jul(Java Util Logging)

3.日誌體系的發展歷史

最早的日誌元件是Apache基金會提供的 Log4j,log4j 能夠通過配置檔案輕鬆的實現日誌系統的管理和多樣化配置, 所以很快被廣泛運用。也是我們接觸得比較早和比較多的日誌元件。它幾乎成了Java社群的日誌標準。

據說 Apache 基金會還曾經建議 Sun 引入 Log4j 到 java 的標準庫中,但Sun拒絕了。 所以 Sun 公司在 java1.4 版本中,增加了日誌庫JUL(Java Util Logging)。其實現基本模仿了 Log4j 的實現。

在JUL出來以前,Log4j 就已經成為一項成熟的技術,使得 Log4j 在選擇上佔據了一定的優勢。Sun推出JUL後,有一些專案使用JUL,也有一些專案使用 log4j,這樣就造成了開發者的混亂,因為這兩個日誌元件沒有關聯,所以要想實現統一管理或者替換就非常困難。怎麼辦呢?

我們可以抽象出一個介面層,對每個日誌實現都適配,這樣這些提供給別人的庫都直指使用抽象層即可。

這個時候又輪到 Apache 出手了,它推出了一個 JCL(Java Commons Logging) 元件,JCL 只是定義了一套日誌介面 (其內部也提供一個 Simple Log 的簡單實現),支援執行時動態載入日誌元件的實現。也就是說,在你應用程式碼裡, 只需呼叫 Commons Logging 的介面,底層實現可以是 Log4j,也可以是Java Util Logging。由於它很出色的完成了主流日誌的相容,所以基本上在後面很長一段時間,是無敵的存在。連spring也都是依賴 JCL 進行日誌管理。

但是故事並沒有結束。原Log4J的作者,它覺得 Apache Commons Logging 不夠優秀,所以他想搞一套更優雅的方案,於是 Slf4j 日誌體系誕生了,slf4j 實際上就是一個日誌門面介面,它的作用類似於 Commons Loggins。 並且他還為 Slf4j 提供了一個 日誌的實現- Logback

另外,還有一個 log4j2 是怎麼回事呢? 因為 slf4j 以及它的實現 Logback 出來以後,很快就趕超了原本 apache 的 log4j 體系,所以 apache 在 2012 年重寫了 log4j, 成立了新的專案 Log4j2

總的來說,日誌的整個體系分為日誌框架和日誌系統

  • 日誌框架:JCL / Slf4j
  • 日誌系統:Log4j、JUL、Logback、Log4j2

而在我們現在的應用中,絕大部分都是使用 slf4j 作為門面, 然後搭配logback或者log4j2日誌系統

在這裡插入圖片描述

相關文章