JAVA日誌在初期可能官方並無提供很好且實用的規範,致使各公司或OSS做者選擇自行造輪子,這也致使了目前初學者以爲市面上 Java 日誌庫繁雜的局面。html
如今市面流行以 slf4j(Simple Logging Facade for Java)作日誌接口,基於門面模式的思想,開發者只需熟悉/使用 slf4j API 便可,而具體實現則是可更替的。java
以 slf4j 的概念,共可劃分爲如下4種庫:apache
日誌接口層 | slf4j-api,common-logging |
日誌實現層 | JUL(java.util.logging) log4j logback slf4j-simple,slf4j-nop |
綁定適配(adaptation)層 | slf4j-jcl slf4j-jdk14 slf4j-log412 |
橋接(bridge)層 | jcl-over-slf4j jul-to-slf4j log4j-over-slf4j |
slf4j 幾種流程示意圖:Bridging legacy APIs
設計模式
接口層的做用上面已經說了
以 SLF4J 爲例,它並不是日誌的實現(固然也沒有實現的概念,由於沒有標準),而是各類日誌框架(java.util.logging,logbacak,log4j)的簡單門面(facade,門面設計模式)或抽象接口,容許用戶在部署時選擇指望的日誌框架實現。api
顧名思義,各類可用日誌框架
需注意:與JDBC這種官方接口規範不一樣,這些日誌框架(如 log4j)並不必定實現自接口層 ,由於 slf4j接口 也只是第三方規範而已。
但有些日誌框架自己就是接口層框架的實現,好比 logback 本地實現了 slf4j框架
爲了讓非本地實現 slf4j 的框架(如 log4j)也能在 slf4j API 下工做,據 sfl4j 版本不一樣有兩種實現方式:ide
爲了避免修改已有項目代碼或想在項目中延用舊日誌框架,同時又想讓slf4j統一處理,可引入橋接包(如 log4j-over-slf4j.jar
)替換原有的日誌框架(log4j.jar
),以此將日誌重定向委託給 SLF4jpost
注意:橋接層與實現層不能爲同一個日誌框架,不然將形成無限循環,這也很容易理解。例如:jcl-over-slf4j.jar
與 slf4j-jcl.jar
不能同時使用性能
如下僅簡略概述,有個大概印象便可(該篇目不意在深刻某具體框架):設計
Log4j
Apache 的開源日誌框架,名稱含義 "Log for Java"
JUL(java.util.logging)
java.util.logging,由 JDK1.4 引入
JCL(Jakarta Commons Logging)
也叫 "Apache Commons Logging",也等同於常說的 common-logging,是爲解決市面上不一樣日誌庫而最先誕生的日誌接口標準。
JCL 只提供日誌接口,具體實現則是在"運行時動態尋找",其內部也有個 Simple logger 簡單實現但功能很弱,所以仍會看到不少程序使用 JCL + log4j 這種搭配。
動態查找原理概述:
但隨着程序規模愈來愈龐大時,JCL動態綁定並不老是能成功,這也是 SLF4J 誕生緣由之一。
SLF4J
爲改進 common-logging 而生的日誌接口
詳見 SLF4J 快速入門 / 原理探究
LogBack
log4j 創始人設計的又一開源日誌組件,通用、可靠、快速靈活 聲稱有極佳的性能。
其一大特點是,其在 logback-classic 中本地(native)實現了 SLF4J API。
當前分爲三個模塊:
java.util.logging.LogManager
上的 @since 1.4
可知nop
表示 no-operation,即無操做空實現。參考:
- java日誌組件介紹(jcl,jul,slf4j,logback很全,很透,看了一遍差很少就明白了
- 日誌系列好文 https://www.cnblogs.com/xuningfans/p/12164734.html
- http://www.slf4j.org/