31

slf4j に特定のログ プロバイダー (私の場合は logback) を強制的に使用させる方法はありますか? 彼らのドキュメントのように:

クラスパスで複数のバインディングが見つかりました

SLF4J API は、一度に 1 つだけの基礎となるロギング フレームワークとバインドするように設計されています。クラスパスに複数のバインディングが存在する場合、SLF4J は警告を発し、それらのバインディングの場所をリストします。クラスパスで複数のバインディングが使用可能な場合は、使用するバインディングを 1 つだけ選択し、他のバインディングを削除します。たとえば、クラス パスに slf4j->simple-1.6.6.jar と slf4j-nop-1.6.6.jar の両方があり、nop (>no-operation) バインディングを使用する場合は、slf4j- を削除します。クラスパスから simple-1.6.6.jar。不要なバインディングを削除できない場合でも、SLF4J は 1 つのロギング フレームワーク/実装にバインドします。バージョン 1.6.6 の時点で、SLF4J は実際にバインドされているフレームワーク/実装クラスに名前を付けます。

注 SLF4J によって発行される警告は、単なる警告です。

私の場合、クラスパスにlog4j.jar、、、およびすべての logback jar があります。一緒に持っているのは間違いであることは知っていますが、私のプロジェクトは非常に大きく、maven の依存関係を見つけて除外するのは必ずしも簡単ではありません。この場合、logback 構成のみを使用するため、slf4j は警告を出力しませんでした。この壺地獄を理解するのに一日かかった。slf4j-log4j12.jarlog4j-over-slf4j.jarslf4j-log4j12.jarlog4j-over-slf4j.jar

私が望むのは、たとえば、JVM引数を介してslf4jにログバックを強制的に使用させることだけです。これにより、警告を出力し、将来jarを除外できます。

4

3 に答える 3

33

通常、独自のコードはクラスパスの先頭にあります。このため、これを行う 1 つの方法は、独自の 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";
    }
}
于 2012-09-20T22:21:06.953 に答える
17

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

于 2012-07-11T14:06:45.423 に答える