對 SLF4J 的一點理解

iteye_401發表於2013-08-04

以下內容主要參考 SLF4J FAQ 文件。只用於記錄我的一點理解,如有必要請仔細閱讀 FAQ 文件。

 

1. 什麼是 SLF4J? 

 

SLF4J is a simple facade for logging systems allowing the end-user to plug-in the desired logging system at deployment time.

 

要理解這句話需要先弄懂幾個概念:

 

  1. facade. 它實際上是 GoF 設計模式中的 Facade 模式,中文是外觀模式。該模式通過一個 Facade 物件為一系列複雜的物件提供簡化的介面。SLF4J 為複雜的 logging system 提供了簡單一致的介面。
  2. logging system. SLF4J 封裝的 logging systems 實現有 log4j 1.2,jdk 1.4 logging 等,使用 SLF4J 必須繫結其中的一種 logging 實現,這種繫結關係以 SLF4J bindings 的形式存在。
  3. plug-in at deployment time. SLF4J 支援在部署時將與之繫結的 logging 實現替換為另一種實現,只需要替換一下 SLF4J binding 的 jar 以及所以賴的具體 logging 實現的 jar。

SLF4J 提供的介面封裝在 slf4j-api.jar 裡。另外,SLF4J 還提供了 5 種 binding:slf4j-nop, slf4j-simple, slf4j-log4j12, slf4j-jdk14 和 logback-classic,每一種 binding 對應了一個 jar。在 SLF4J 的每一個版本的發行包中包括了 slf4j-api.jar 以及 5 種 binding 的 jar。

 

從 SLF4J 使用者的角度看,slf4j-api 是 backward compatible(向後相容)的,這種相容意味著當你使用任何版本的 slf4j-api 都可以成功通過編譯。但也只是僅此而已,因為你使用 SLF4J 不只是使用 slf4j-api 這一個jar,SLF4J 發行包裡的其它 binding jar 對 slf4j-api.jar 的版本存在依賴。對 binding jar 和 slf4j-api.jar 不同版本號的混合使用可能會導致意想不到的錯誤,因為不同版本的實現存在差異。

 

2. 什麼時候應該考慮使用 SLF4J?

 

由於 SLF4J 為不同的 logging 實現提供了統一的介面,在工程裡使用 SLF4J 的好處是:你不必依賴於某個特定的 logging 實現的介面,當你需要換一種 logging 的實現時,只需要簡單的替換幾個 jar 包,而無須修改散佈在程式碼各處的 logging 介面呼叫。當然,這種應用場景可能並不常見。對於獨立的應用來說,當選用了一種 logging 實現後,很少會去考慮替換為另一種 logging 實現。並且,在獨立應用裡,即使使用了 SLF4J,也需要呼叫底層的 logging 實現去完成基本的 logging 操作,畢竟 SLF4J 只是一個 facade。所以,對於獨立應用而言,一般不需要使用 SLF4J。

 

SLF4J 這種將統一介面與具體 logging 實現解耦的方式給 API libary 的設計帶來的好處是最為明顯的。因為,如此一來,API 的最終使用者可以靈活的選用適合自己的底層 logging 實現,要做的也只是引入 SLF4J 的某個 binding jar 而已。

相關文章