2012-07-11 13 views
21

slf4jに特定のロギングプロバイダ(私の場合はログバック)を強制的に使用させることはありますか?そのドキュメントのように:slf4jがログバックを使用するようにする

複数のバインディングがクラスパス上で発見された

SLF4J APIは1と同時に複数の基本的なログフレームワークと結合するdesingedされます。クラスパスに複数のバインディングが存在する場合、SLF4Jは警告を出力し、それらのバインディングの場所をリストします。 クラスパスで複数のバインディングを使用できる場合は、使用するバインドを1つだけ選択し、他のバインディングを削除します。たとえば、クラスパスにslf4j-> simple-1.6.6.jarとslf4j-nop-1.6.6.jarの両方があり、nop(>操作なし)バインディングを使用する場合は、slf4j-シンプルな - 1.6.6.jarクラスパスから。超束縛バインディングを削除できない場合、SLF4Jは依然として1つのロギングフレームワーク/実装とバインドします。バージョン1.6.6以降、SLF4Jは実際にバインドされているフレームワーク/実装クラスの名前を付けます。

注記SLF4Jが発する警告はそれだけです。警告です。私の場合は

私はlog4j.jarslf4j-log4j12.jarlog4j-over-slf4j.jarおよびクラスパス内のすべてのlogbackの瓶を持っています。私はslf4j-log4j12.jarlog4j-over-slf4j.jarを一緒に持つのは誤りだと知っていますが、私のプロジェクトは非常に大きく、maven依存関係を見つけたり除外したりするのは簡単ではありません。この場合、slf4jは警告を表示しませんでした。なぜなら我々はlogback configsしか使用しないからです。このジャーの地獄を理解するには1日かかりました。

私が欲しいのは、たとえば、JVM引数を使ってslf4jがlogbackを使用するようにすることです。警告を出力して、将来jarを除外することができます。

答えて

14

クラスパスをクリーンアップする以外に、強制的にSLF4Jを特定の実装にバインドする方法はありません。

+0

それは – madhead

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

+2

これは素晴らしい答えです – StormeHawke

+0

このコードをログバックに使用する方法、ILoggerFactory getLoggerFactory()は新しいJDK14LoggerFactory()の代わりに何を返すべきですか? – nagSumanth

関連する問題