JAVA日志發展史


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM