歡迎光臨
每天分享高質量文章

一文讀懂常用日誌框架(Log4j、SLF4J、Logback)有啥區別

點擊上方“芋道原始碼”,選擇“設為星標

做積極的人,而不是積極廢人!

原始碼精品專欄

 

來源:http://t.cn/EVpprGI

  • 1、概述
  • 2、Commons Logging
  • 3、SLF4J
  • 4、Log4j
  • 5、Log4j2
  • 6、Logback
  • 總結

1、概述

相信目前大多數情況下,不管是開源框架或是平時我們工作編碼中都離不開一種框架,它就是日誌框架。因此本節就簡單瞭解一下我們常用日誌框架的區別。

2、Commons Logging

common-logging是apache提供的一個通用的日誌接口,
在common-logging中,有一個Simple logger的簡單實現,但是它功能很弱,所以使用common-logging,通常都是配合著log4j來使用;

Commons Logging定義了一個自己的接口 org.apache.commons.logging.Log,以屏蔽不同日誌框架的API差異,這裡用到了Adapter Pattern(配接器樣式)。

3、SLF4J

Simple Logging Facade for Java(SLF4J)用作各種日誌框架(例如java.util.logging,logback,log4j)的簡單外觀或抽象,允許最終用戶在部署時插入所需的日誌框架。

要切換日誌框架,只需替換類路徑上的slf4j系結。 例如,要從java.util.logging切換到log4j,只需將slf4j-jdk14-1.8.0-beta2.jar替換為slf4j-log4j12-1.8.0-beta2.jar

SLF4J不依賴於任何特殊的類裝載機制。 實際上,每個SLF4J系結在編譯時都是硬連線的,以使用一個且只有一個特定的日誌記錄框架。 例如,slf4j-log4j12-1.8.0-beta2.jar系結在編譯時系結以使用log4j。 在您的代碼中,除了slf4j-api-1.8.0-beta2.jar之外,您只需將您選擇的一個且只有一個系結放到相應的類路徑位置。 不要在類路徑上放置多個系結。

以下是slf4j 系結其它日誌組件的圖解說明。

因此,slf4j 就是眾多日誌接口的集合,他不負責具體的日誌實現,只在編譯時負責尋找合適的日誌系統進行系結。具體有哪些接口,全部都定義在slf4j-api中。查看slf4j-api原始碼就可以發現,裡面除了public final class LoggerFactory類之外,都是接口定義。因此,slf4j-api本質就是一個接口定義。

總之,Slf4j更好的兼容了各種具體日誌實現的框架,如圖:

4、Log4j

Apache Log4j是一個非常古老的日誌框架,並且是多年來最受歡迎的日誌框架。 它引入了現代日誌框架仍在使用的基本概念,如分層日誌級別和記錄器。

2015年8月5日,該專案管理委員會宣佈Log4j 1.x已達到使用壽命。 建議用戶使用Log4j 1升級到Apache Log4j 2。

5、Log4j2

Apache Log4j 2是對Log4j的升級,它比其前身Log4j 1.x提供了重大改進,並提供了Logback中可用的許多改進,同時修複了Logback架構中的一些固有問題。

與Logback一樣,Log4j2提供對SLF4J的支持,自動重新加載日誌配置,並支持高級過濾選項。 除了這些功能外,它還允許基於lambda運算式對日誌陳述句進行延遲評估,為低延遲系統提供異步記錄器,並提供無垃圾樣式以避免由垃圾收集器操作引起的任何延遲。

所有這些功能使Log4j2成為這三個日誌框架中最先進和最快的。

6、Logback

logback是由log4j創始人設計的又一個開源日誌組件,作為流行的log4j專案的後續版本,從而替代log4j。

Logback的體系結構足夠通用,以便在不同情況下應用。 目前,logback分為三個模塊:logback-core,logback-classic和logback-access。

logback-core:模塊為其他兩個模塊的基礎。

logback-classic:模塊可以被看做是log4j的改進版本。此外,logback-classic本身實現了SLF4J API,因此可以在logback和其他日誌框架(如log4j或java.util.logging(JUL))之間來回切換。

logback-access:模塊與Servlet容器(如Tomcat和Jetty)集成,以提供HTTP訪問日誌功能。

總結

我建議直接選擇SLF4J而不是Log4j,commons logging,logback或java.util.logging

1、在開源庫或內部庫中使用SLF4J,將使其獨立於任何特定的日誌記錄實現,這意味著無需為多個庫管理多個日誌記錄配置,您的客戶端將會很需要這一點。

2、SLF4J提供了基於占位符的日誌記錄,通過刪除檢查(isDebugEnabled(),isInfoEnabled()等)來提高代碼的可讀性。

3、另外,臨時字串數量越少意味著垃圾收集器的工作量就越少,這意味著應用程式的吞吐量和性能會更好。

這些優勢只是冰山一角,當您開始使用SL4J深入瞭解它時,您將看到更多的優點。 我強烈建議,Java中的任何新代碼開發都應該使用SLF4J來記錄日誌。



歡迎加入我的知識星球,一起探討架構,交流原始碼。加入方式,長按下方二維碼噢

已在知識星球更新原始碼解析如下:

如果你喜歡這篇文章,喜歡,轉發。

生活很美好,明天見(。・ω・。)ノ♡

    閱讀原文

    赞(0)

    分享創造快樂