JAVA日誌發展史

一懶眾衫小QAQ發表於2021-12-12

JAVA日誌發展史

第一階段

2001年以前,Java是沒有日誌庫的,列印日誌全憑System.outSystem.err

缺點:

  1. 產生大量的IO操作同時在生產環境中無法合理的控制是否需要輸出
  2. 輸出的內容不能儲存到檔案
  3. 只列印在控制檯,列印完就過去了,也就是說除非你一直盯著程式跑
  4. 無法定製化,且日誌粒度不夠細

第二階段

2001年,一個ceki Gulcü的大佬搞了一個日誌框架 log4j後來( log4j成為Apache專案,Ceki加入Apache組織
Apache還曾經建議Sun引入Log4j到Java的標準庫中,但Sun拒絕了.

image-20211212211243016

第三階段

sun有自己的小心思,2002年2月JDK1.4釋出,Sun推出了自己的日誌標準庫JUL(Java Util Logging),其實是照著Log4j抄的,而且還沒抄好,還是在JDK1.5以後效能和可用性才有所提升。由於Log4j比JUL好用,並且成熟,所以Log4j在選擇上佔據了一定的優勢。

第四階段

2002年8月Apache推出了JCL(Jakarta Commons Logging),也就是日誌抽象層,支援執行時動態載入日誌元件的實現,當然也提供一個預設實現Simple Log(在 ClassLoader 中進行查詢,如果能找到Log4j則預設使用llog4j實現,如果沒有則使用JUL實現,再沒有則使用JCL內部提供的 Simple Log實現)。

image-20211212211444752

但是JUL有三個缺點:

1.效率較低。
2.容易引發混亂。
3.使用了自定義ClassLoader的程式中,使用JCL會引發記憶體洩露。

第五階段

2006年巨佬Ceki( Log4j的作者)因為一些原因離開了Apache組織,之後Ceki覺得JCL不好用,自己攙了一套新的日誌標準介面規範Slf4j (Simple Logging Facacfor Java),也可以稱為日誌門面,很明顯Slf4j是對標JCL,後面也證明了Slf4j比JCL更優秀。
巨佬Ceki提供了一系列的橋接包來幫助Slf4j介面與其他日誌庫建立關係,這種方式稱橋接設計模式。
程式碼使用Slf4j介面,就可以實現日誌的統一標準化,後續如果想要更換日誌實現,只需引入Slf4j與相關的橋接包,再引入具體的日誌標準庫即可。

第六階段

Ceki巨佬覺得市場上的日誌標準庫都是間接實現Slf4j介面,也就是說每次都需要配合橋接包,因此在2006年,Ceki巨佬基於Slf4j介面寫出了Logback日誌標準庫,做為Slf4j介面的預設實現,Logback 也十分給力,在功能完整度和效能上超越了所有已有的日誌標準庫。

  • 根本原因還在於,隨著使用者體量的提升,Log4j無法滿足高效能的要求,成為應用的效能瓶頸

    目前Java日誌體系關係圖如下

    • 通過SLF4j橋接到具體的日誌框架實現

image-20211212214154208

  • 通過其他日誌框架橋接到slf4j

image-20211212214332343

第七階段

2012年,Apache直接推出新專案Log4j2(不相容Log4j) , Log4j2全面借鑑Slf4j+Logback 。
Log4j2不僅僅具有Logback的所有特性,還做了分離設計,分為log4j-api和log4j-core,log4j-api是日誌介面,log4j-core是日誌標準庫,並且Apache也為Log4j2提供了各種橋接包。

而且log4j2 的效能提升很大,而且支援非同步日誌列印。增加很多新的特性。

image-20211212213142279

相關文章