參考文章:
Simplifying the distinction between SL4J and commons logging
日誌那點事兒——slf4j源碼剖析
slf4j門面模式實現原理
SLF4J 與 CommonsLogging 原理對比
SLF4J 工作原理
如上圖示意
- slf4j 會在 classpath 中進行掃描, 尋找可用於 slf4j 綁定的日誌實現類庫
- 如果只找到一個可用於綁定的日誌類庫, 就會正常進行綁定, 在運行過程中, 將所有面向 slf4j 的調用翻譯爲對應的日誌實現類庫調用
- 如果存在多個可用於綁定日誌類庫, 就會提示報錯
Commons Logging工作原理
如上圖示意
- Commons Logging 有一個神奇的邏輯層, 會首先去嘗試在 commons-logging.properties 配置文件中查找是否已經設置了
org.apache.commons.logging.log property
這一屬性 或者在應用內存中查找是否已經通過 Commons Logging API 設置過這一屬性。- 如果找到, 則用 Commons Logging 的日誌實現類
- 如果沒找到, 在 classPath 中查找是否有 log4j 實現, 有則使用
- 如果還沒找到, 直接嘗試用 JDK1.4 以上的內置日誌實現
- 如果JDK 低於1.4, 則 使用 CommonsLog 中的SimpleLog 實現
優劣對比
SLF4J 的優點在於其策略足夠簡單, 在擁有maven, gradle 等此類依賴管理工具時, 我們可以很方便的確定, 最終日誌的實現
Common Logging 的優點在於當類路徑中存在多個日誌實現庫(jar)時 , 它有一個確定的規則最終選出一個實現類, 而不會因爲多個實現類庫的共同存在而報錯無法完成綁定
由於目前maven, gradle 等構件工具完全可以高效清晰地幫助我們管理項目的依賴, SLF4J 在綁定策略的簡單性上,給我們減少了很多出錯的可能, 以及查錯的成本, 綜合來看, SLF4J 以期簡單的特定更容易被廣泛使用