【Java雜記】日誌:Java日誌體系,從應用場景到發展歷史
在實際應用中,日誌是最重要的一個元件。它可以為系統提供錯誤以及日常的定位,也可以對訪問的記錄進行跟蹤。當然,在很多大型的網際網路應用中,基於日誌的收集以及分析可以瞭解使用者的使用者畫像,比如興趣愛好、點選行為。
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日誌系統
相關文章
- JAVA日誌發展史Java
- Java日誌框架演化歷史Java框架
- [Java/日誌] 日誌框架列印應用程式日誌程式碼的執行情況Java框架
- 批量匯入歷史檔案到日誌服務
- ELK日誌系統之通用應用程式日誌接入方案
- 阿里雲日誌服務sls的典型應用場景阿里
- Java 日誌框架 LogbackJava框架
- JAVA GC日誌分析JavaGC
- logrotate自動輪換切割壓縮和清理歷史日誌場景介紹logrotate
- Java應用日誌如何與Jaeger的trace關聯Java應用日誌
- Java的標準日誌Java
- JAVA異常和日誌Java
- 萬字長文帶你瞭解Java日誌框架使用Java日誌框架Java框架
- ARMS實踐|日誌在可觀測場景下的應用
- Java日誌:您需要了解的4種日誌型別Java型別
- Java日誌記錄幾種實現方案Java
- 從Java 9開始JDK已經提供日誌記錄器JavaJDK
- hadoop配置歷史伺服器&&配置日誌聚集Hadoop伺服器
- 你還不懂java的日誌系統嗎Java
- Java日誌框架:logback詳解Java框架
- java日誌列印使用指南Java
- 掌握Java各種日誌框架Java框架
- java 日誌脫敏框架 sensitive,優雅的列印脫敏日誌Java框架
- Java 開發中常用的日誌模組Java
- 微服務體系操作日誌如何記錄?微服務
- Java新手學習Java專案打日誌Java
- Spark歷史日誌伺服器開啟及配置Spark伺服器
- 細說 Java 主流日誌工具庫Java
- Java-異常、斷言和日誌Java
- java專案日誌配置檔案Java
- Java日誌正確使用姿勢Java
- Logstash 配置Java日誌格式的方法Java
- 應用日誌採集是什麼意思?批次採集應用日誌軟體用哪個?怎麼操作?應用日誌
- 日誌架構演進:從集中式到分散式的Kubernetes日誌策略架構分散式
- 日誌篇:模組日誌總體介紹
- 日誌系統
- 通過helm部署EFK收集應用日誌,ingress-nginx日誌解析。應用日誌Nginx
- Java核心技術筆記 異常、斷言和日誌Java筆記