Log4j、SLF4J、Logback、Log4j2 日誌知多少

你是否接觸過Java的日誌框架?對這些框架知道多少,這裡簡單掃個盲

Log4j、SLF4J、Logback、Log4j2 日誌知多少

我們常見的java日誌框架主要有:Log4j、SLF4J、Logback、Log4j2,他們的歷史如下:

上訴日誌框架中出現最早的是Log4j。始於1996年,終於2015年

最早由Ceki建立,經過不斷完善,成為了Apache基金會其中的一個專案,同時作者Ceki也加入了Apache

Apache基金會曾建議過Sun將Log4j引入到Java的標準庫中,但被拒絕

Sun公司後面自己推出了一套日誌庫JUL(Java Util Logging),基本是模仿Log4j的實現

後面Apache又推出了JCL(Jakarta Commons Logging),而JCL只是一套日誌介面,底層實現可以使用Log4j,也可以使用 JUL

Ceki後來離開了Apache,並先後建立了SLF4J和Logback兩個專案,其中SLF4J是一套日誌門面介面,類似JCL。而Logback是底層實現

雖然JCL依靠Apache的使用者數量,有很大優勢,但逐步被Logback趕超。以至於在2012年,重寫了Log4j,成立新專案為Log4j2,此專案擁有Logback所有的特性

現如今普遍使用方式為:SLF4J作為日誌介面,Log4j2作為日誌實現

SLF4J的出現,是因為作者Ceki認為JCL的API設計不好,容易寫出有效能問題的程式碼,如下面這種

上訴造成的問題是,這種debug級別的日誌,存在於生產環境中但不會輸出。然而,即使不會輸出,這裡仍然有一個拼接字串的操作,如果這一段debug的程式碼被多次呼叫,那麼就可能產生很多無用的字串,影響效能。因此,在JCL中,正確的做法應該是如下:

而SLF4J則做了如下的最佳化處理

這種寫法,在不輸出日誌時,不會進行字串的拼接

上面講述的日誌框架,實際可以分為

介面

實現

這兩種形式

介面:JCL、SLF4J

實現:Log4j、JUL、Logback、Log4j2

匯入slf4j-api-1。7。36。jar、slf4j-simple-1。7。36。jar 即可使用SLF4J列印 Hello World,如下

slf4j-simple-1。7。36。jar 是對SLF4J的一個簡單實現,一般小專案直接使用這個即可

SLF4J支援其他日誌框架,不過,如果要將SLF4J和其他日誌框架一起使用,那麼還需要相應的依賴包

Log4j、SLF4J、Logback、Log4j2 日誌知多少

slf4j-log4j12-1.7.36.jar

log4j 1。2 版的繫結/提供程式,一個廣泛使用的日誌記錄框架。從 SLF4J 1。7。35 開始,slf4j-log4j 模組在構建時會自動重定向到 slf4j-reload4j 模 塊。如果繼續使用log4j 1。x框架,最好是改用 slf4j-reload4j

slf4j-reload4j-1.7.36.jar

自 1。7。33 起用於 reload4j 框架的繫結/提供程式。Reload4j是log4j版本 1。2。7的直接替代品。同時還需要 reload4j。jar。

slf4j-jdk14-1.7.36.jar

slf4j-nop-1.7.36.jar

NOP 的繫結/提供程式,以靜默方式丟棄所有日誌記錄

slf4j-simple-1.7.36.jar

用於簡單實現的繫結/提供程式,它將所有事件輸出到 System。err。僅打 印級別 INFO 及更高級別的訊息

slf4j-jcl-1.7.36.jar

Jakarta Commons Logging的繫結/提供程式。此繫結會將所有 SLF4J 日誌記錄委派給 JCL

logback-classic-1.2.10.jar (需要 logback-core-1.2.10.jar)

參考來源:

SLF4J 手冊

https://www。slf4j。org/manual。html

Java 日誌二三事 - 知乎 (zhihu。com)

https://zhuanlan。zhihu。com/p/54768020

日誌門面Slf4j - 知乎 (zhihu。com)

https://zhuanlan。zhihu。com/p/394685808

TAG: 日誌Slf4j36jar