1. 程式人生 > >解決工程中多種日誌框架衝突

解決工程中多種日誌框架衝突

日常開發中,在程式碼中加日誌是必不可少的。然而,由於引用很多第三方的包,而這些第三方包所用的日誌框架和版本又不盡相同,比如有log4j、log4j2、logback和Java自帶的Logging。

為了不強制依賴某個日誌框架,我們會使用slf4j(The Simple Logging Facade for Java),其實slf4j只是一個日誌標準,並不是日誌系統的具體實現。slf4j只做兩件事情:

  • 提供日誌介面

  • 提供獲取具體日誌物件的方法

而slf4j-simple、logback都是slf4j的具體實現,log4j並不直接實現slf4j,但是有專門的一層橋接slf4j-log4j12來實現slf4j。

工程中有多個日誌框架存在,在啟動時就會有警告資訊,如:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/OperationSVN/專案工程/bi-gate/target/bi-gate-1.0.0/WEB-INF/lib/logback-classic-1.1.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/OperationSVN/專案工程/bi-gate/target/bi-gate-1.0
.0/WEB-INF/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

此警告資訊表示工程中有logback和log4j兩種日誌框架,最後slf4j選擇了logback。那麼該問題如何解決呢,可以看出日誌中也打印出來了問題說明的網址,見http://www.slf4j.org/codes.html#multiple_bindings

slf4j在類路徑發現多個繫結

總結一下,若不想使用某個日誌框架,就在依賴中排除該框架的依賴。比如示例中,工程依賴了cassandra-all,而cassandra-all內部使用了log4j作為日誌框架,若我們工程不想使用log4j,就需要排除log4j和slf4j-log4j12兩個依賴。