1. 程式人生 > >SLF4J - 一個允許你統一日誌記錄API的抽象層

SLF4J - 一個允許你統一日誌記錄API的抽象層

工作 為什麽 pom font 管理 生產 由於 ring 正在

一、什麽是SLF4J

我們在做Java開發時,如果需要記錄日誌,有很多日誌API可供選擇,如:

  • java.util.logging
  • Apache log4j
  • logback

SLF4J又是個什麽東東呢?為什麽使用SLF4J比使用log4j或者java.util.logging更好呢?這是因為與所有提到的這些日誌記錄庫相比,SLF4J沒有真正地實現日誌記錄,相反它只是一個允許你使用任何處於後端的日誌記錄庫的 抽象層 。

如果你正在編寫內部或者外部使用的API或者應用庫的話,那麽你真的不需要讓使用你所編寫的庫的客戶端去選擇使用某種日誌庫。

假設項目已經使用了log4j,而且你包含一個名為Apache Active MQ的庫,這個庫還依賴於另一個日誌記錄庫logback的話,那麽你還需要包含它們,

然而,如果Apache Active MQ使用了SLF4J的話,你可以繼續使用你的日誌記錄庫,而不需要痛苦地添加和維護新的日誌記錄框架。

簡短的說,SLF4J讓你的代碼獨立於任何特定的日誌記錄API,這個好的想法尤其適合於公共組件的API開發人員。

雖然日誌記錄庫的抽象理念不是新的,Apache的commons logging日誌記錄庫也用了這個理念,不過現在SLF4J很快就會成為Java世界裏標準的日誌記錄庫

讓我們看一些使用 SLF4J而不使用log4j,logback或者java.util.logging的理由。

二、寧願使用SLF4J也不願使用Log4J,logback和java.util.Logging?

1、獨立於任何日誌記錄API庫

正如前面所說,在代碼中編寫日誌記錄語句使用SLF4J的主要動機是讓你的程序獨立於任何特定的日誌記錄庫,這些日誌記錄庫可能需要與你現在配置不同的配置,而且還會引入更多令人頭疼的維護問題。

2、占位符功能

然而除了這個之外,SLF4J API還有一個讓你使用SLF4J而不是用長期感興趣的 Log4j 更讓人信服的功能,也就是占位符功能,在代碼中用{}來表示。

占位符功能與 String的format()方法中 的%s非常相似,因為它在運行時刻才提取所提供的真正的字符串。這不僅縮減了代碼中的許多字符串連接,而且減少了創建String對象所需要的資源。

即便在你生產環境日誌級別比如DEBUG和INFO級別的字符串連接可能不需要的時候,仍然可以起到同樣的效果。

由於 字符串是不可更改的 ,而且它們是在字符串池中創建的,這些字符串使用了 堆內存 ,當應用在生產環境中運行在ERROR級別的時候,字符串在大多數情況下就不是必須的,比如DEBUG語句裏的字符串就不是必須的。

通過使用SLF4J,你可以延遲字符串的創建到運行時刻,這意味著只有在需要字符串的時候才創建它。

如果你已經使用了log4j,那麽你已經熟悉把調試語句放入if()條件內的工作場景,而SLF4J占位符功能比log4j更適合這種場景。

技術分享

三、如何使用SLF4J和Log4J來做日誌

使用SLF4J需要引入slf4j-api-1.6.1.jar,還要引入協同工作的JAR包,具體什麽jar包則依賴於後端你使用了什麽日誌工具庫。
假如你想使用SLF4J和Lo4J搭夥工作,那麽你需要把下列jar包引入到你的classpath中,
具體版本要視你使用的SLF4J和log4J版本而定, 比如:
slf4j-api-1.6.1.jar - JAR for SLF4J API
log4j-1.2.16.jar - JAR for Log4J API
slf4j-log4j12-1.6.1.jar - Log4J Adapter for SLF4J

如果你使用Maven來管理項目依賴,你可以只引入SLF4J JAR,然後maven會引入它所依賴的其它JAR包。
為了使用Log4J和SLF4J,你可以在你項目的pom.xml中添加下列依賴

技術分享

順便說一下,如果你對使用帶參數版的日誌方法感興趣,那就需要引入SLF4J 1.7版本。

四、總結

選擇SLF4J而不是直接選用Log4j, commons logging, logback 或者 java.util.logging的理由如下:

1)在你的開源庫或者私有庫中使用SLF4J,可以獨立於任何的日誌實現,這就意味著不需要管理多個庫和多個日誌文件。你的客戶端將會體會到這一點。

2)SLF4J 提供了占位日誌記錄,通過移除對isDebugEnabled(), isInfoEnabled()等等的檢查提高了代碼的可讀性。

3)通過使用日誌記錄方法,直到你使用到的時候,才會去構造日誌信息(字符串),這就同時提高了內存和CPU的使用率。

4)做一個側面的說明,越少的臨時字符串,垃圾回收器就意味著越少的工作,這就意味著為你的應用程序提供更好的吞吐量和性能。

這些優勢都只是冰山一角,當你開始使用SL4J並閱讀它,你會學到更多的好處。我強烈建議,在java中任何新的代碼開發,都應使用SLF4J而不是任何的日誌API,包括log4J。

SLF4J - 一個允許你統一日誌記錄API的抽象層