2012-07-11 65 views
21

有沒有辦法強制slf4j使用特定的日誌記錄提供程序(在我的情況是logback)?在他們的文檔:強制slf4j使用logback

多個綁定中的類路徑中找到

SLF4J API飛漫到一個和在同一時間只有一個底層的日誌框架約束。如果類路徑中存在多個綁定,則SLF4J將發出警告,列出這些綁定的位置。 當類路徑中有多個綁定可用時,請選擇您希望使用的一個且僅一個綁定,並刪除其他綁定。例如,如果在類路徑中同時包含slf4j-> simple-1.6.6.jar和slf4j-nop-1.6.6.jar,並且您希望使用nop(> no-operation)綁定,則請刪除slf4j-類路徑中的simple-1.6.6.jar。如果無法刪除超級綁定,SLF4J仍然會綁定一個日誌框架/實現。從版本1.6.6開始,SLF4J將命名它實際綁定的框架/實現類。

注意SLF4J發出的警告就是這樣一個警告。

在我的情況,我有log4j.jarslf4j-log4j12.jarlog4j-over-slf4j.jar在classpath中所有的logback罐子。我知道將slf4j-log4j12.jarlog4j-over-slf4j.jar放在一起是錯誤的,但我的項目非常大,並且找到並排除Maven依賴關係並不總是很簡單。在這種情況下,slf4j甚至沒有打印任何警告,因爲我們只使用logback配置。我花了一天的時間才明白這個地獄。

我想要的只是通過JVM參數強制slf4j使用logback,因此它可以打印警告,我可以在將來排除jar。

回答

14

除了清理類路徑之外,沒有辦法強制SLF4J與給定的實現綁定。

+0

這對我來說很可惜 – madhead 2012-07-11 17:36:49

17

通常,您自己的代碼位於類路徑的開頭。正因爲如此,要做到這一點的方法之一是創建自己的org.slf4j.impl.StaticLoggerBinder類:

package org.slf4j.impl; 

import org.slf4j.ILoggerFactory; 
import org.slf4j.spi.LoggerFactoryBinder; 

/** 
* Force tests to use JDK14 for logging. 
*/ 
@SuppressWarnings("UnusedDeclaration") 
public class StaticLoggerBinder implements LoggerFactoryBinder { 
    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder(); 

    public static String REQUESTED_API_VERSION = "1.6"; 

    public static final StaticLoggerBinder getSingleton() { 
     return SINGLETON; 
    } 

    private StaticLoggerBinder() { 
    } 

    @Override 
    public ILoggerFactory getLoggerFactory() { 
     return new JDK14LoggerFactory(); 
    } 

    @Override 
    public String getLoggerFactoryClassStr() { 
     return "org.slf4j.impl.JDK14LoggerFactory"; 
    } 
} 
+0

謝謝你的答案,但我已經清理了我的類路徑。 – madhead 2012-09-22 21:19:05

+2

即使如此,這是一個很好的回答 – StormeHawke 2015-08-31 15:43:35

+0

如何使用此代碼進行logback,應該返回ILoggerFactory getLoggerFactory()而不是新的JDK14LoggerFactory() – nagSumanth 2015-12-01 12:52:23

相關問題