
作為一名 Java 程式員,日常開發工作中肯定會接觸日志系統,但是衆多的架構,包括 Log4j、Log4j2、Logback、Slf4j、Apache Common logging 等等,引用的 maven 依賴衆多,到底可以去掉哪些,一行
LoggerFactory.getLogger(LogbackTest.class)
後做了哪些工作,怎麼去找的配置檔案,這些還是有很多細節可以去研究的。
目前的日志架構有 jdk 自帶的 logging,log4j1、log4j2、logback ,這些架構都自己定制了日志 API ,并且有相應的實作;目前用于實作日志統一的架構 Apache commons-logging、slf4j ,遵循「面向接口程式設計」的原則,這兩大架構可以讓使用者在程式運作期間去選擇具體的日志實作系統(log4j1\log4j2\logback等)來記錄日志,是統一抽象出來的一些接口。
這些日志系統涉及到的繁雜的各種內建 jar 包,如下:
- log4j、log4j-api、log4j-core
- log4j-1.2-api、log4j-jcl、log4j-slf4j-impl、log4j-jul
- logback-core、logback-classic、logback-access
- commons-logging
- slf4j-api、slf4j-log4j12、slf4j-simple、jcl-over-slf4j、slf4j-jdk14、log4j-over-slf4j、slf4j-jcl
log4j Apache 的一個開放源代碼項目,通過使用Log4j,我們可以控制日志資訊輸送的目的地是控制台、檔案、GUI元件、甚至是套接口服務 器、NT的事件記錄器、UNIX Syslog守護程序等;使用者也可以控制每一條日志的輸出格式;通過定義每一條日志資訊的級别,使用者能夠更加細緻地控制日志的生成過程。這些可以通過一個 配置檔案來靈活地進行配置,而不需要修改程式代碼。最新的目前版本為
log4j 1.2
,maven 依賴如下:
Logback 是由 log4j 創始人設計的又一個開源日記元件,Logback 目前分成三個子產品:logback-core,logback- classic和logback-access。logback-core是其它兩個子產品的基礎子產品,logback-classic是log4j的一個 改良版本。此外logback-classic 完整實作 SLF4J API 使你可以很友善地更換成其它日記系統如log4j或JDK14 Logging。logback-access通路子產品與Servlet容器內建提供通過Http來通路日記的功能。maven 最新依賴如下:
Logback 作為一個通用可靠、快速靈活的日志架構,将作為 Log4j 的替代和 SLF4J 組成新的日志系統的完整實作。Logback 聲稱具有極佳的性能,“ 某些關鍵操作,比如判定是否記錄一條日志語句的操作,其性能得到了顯著的提高。這個操作在LogBack中需要3納秒,而在Log4J中則需要30納秒。LogBack 建立記錄器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它擷取已存在的記錄器隻需94納秒,而 Log4J需要2234納秒,時間減少到了1/23。跟JUL相比的性能提高也是顯著的”。另外,Logback的所有文檔是全面免費提供的,不象Log4J那樣隻提供部分免費文檔而需要使用者去購買付費文檔。具體包括:
- 更快的執行速度
- 更充分的測試
- logback-classic 非常自然的實作了SLF4J
- 使用XML配置檔案或者Groovy
- 自動重新載入配置檔案
- 優雅地從I/O錯誤中恢複
- 自動清除舊的日志歸檔檔案
- 自動壓縮歸檔日志檔案
- 謹慎模式
- Lilith
- 配置檔案中的條件處理
- 更豐富的過濾
- Logback-access子產品,提供了通過HTTP通路日志的能力,是logback不可或缺的組成部分
Slf4j與其它日志元件的關系說明
- Slf4j的設計思想比較簡潔,使用了Facade設計模式,Slf4j本身隻提供了一個slf4j-api-version.jar包,這個jar中主要是日志的抽象接口,jar中本身并沒有對抽象出來的接口做實作。
- 對于不同的日志實作方案(例如Logback,Log4j...),封裝出不同的橋接元件(例如logback-classic-version.jar,slf4j-log4j12-version.jar),這樣使用過程中可以靈活的選取自己項目裡的日志實作。
Slf4j與其它日志元件調用關系圖
Slf4j與其他各種日志元件的橋接說明
jar包名 | 說明 |
---|---|
slf4j-log4j12-1.7.13.jar | Log4j1.2版本的橋接器,你需要将Log4j.jar加入Classpath。 |
slf4j-jdk14-1.7.13.jar | java.util.logging的橋接器,Jdk原生日志架構。 |
slf4j-nop-1.7.13.jar | NOP橋接器,默默丢棄一切日志。 |
slf4j-simple-1.7.13.jar | 一個簡單實作的橋接器,該實作輸出所有事件到System.err. 隻有Info以及高于該級别的消息被列印,在小型應用中它也許是有用的。 |
slf4j-jcl-1.7.13.jar | Jakarta Commons Logging 的橋接器. 這個橋接器将Slf4j所有日志委派給Jcl。 |
logback-classic-1.0.13.jar(requires logback-core-1.0.13.jar) | Slf4j的原生實作,Logback直接實作了Slf4j的接口,是以使用Slf4j與Logback的結合使用也意味更小的記憶體與計算開銷 |
pom核心配置如下
本公衆号團隊成員由餓了麼、阿裡、螞蟻金服等同僚組成,關注架構師之巅,可以了解最前沿的技術。
·END·
架構師之巅
時刻關注最前沿的技術
微信号:
jiagoushizhidian