web-dev-qa-db-ja.com

複数のバインディングに関するSLF4J警告を抑制する方法は?

私のJavaプロジェクトには、さまざまなSLF4Jバージョンとの依存関係があります。迷惑な警告を抑制するにはどうすればよいですか?

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:xyz234/lib/slf4j-
log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:xyz123/.m2/repository/org/slf4j/slf4j-log4j12
/1.6.0/slf4j-log4j12-1.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

追伸:これは 同じバインディングが重複していることについてのslf4j警告 と同じ質問ではありません。答えは誤警報警告を取り除く方法ですが、私の場合は真の警告です。 P.S.S。:申し訳ありませんが、言及するのを忘れました:私はMavenを使用しており、SLF4Jは依存関係の依存関係に含まれています。

14
Konrad Höffner

_slf4j-log4j12-1.5.8.jar_または_slf4j-log4j12-1.6.0.jar_のいずれかをクラスパスから削除します。プロジェクトは、SLF4Jの異なるバージョンに依存するべきではありません。 1.6.0のみを使用することをお勧めします。

Mavenを使用している場合は、 推移的な依存関係を除外 できます。次に例を示します。

_<dependency>
    <groupId>com.Sun.xml.stream</groupId>
    <artifactId>sjsxp</artifactId>
    <version>1.0.1</version>
    <exclusions>
        <exclusion>
            <groupId>javax.xml.stream</groupId>
            <artifactId>stax-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
_

現在のslf4j-api実装 では、これらの警告を削除することはできません。 _org.slf4j.LoggerFactory_クラスは、メッセージを出力します。

_  ...
  if (implementationSet.size() > 1) {
    Util.report("Class path contains multiple SLF4J bindings.");
    Iterator iterator = implementationSet.iterator();
    while(iterator.hasNext()) {
      URL path = (URL) iterator.next();
      Util.report("Found binding in [" + path + "]");
    }
    Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation.");
  }
  ...
_

Utilクラスは次のとおりです。

_public class Util {

  static final public void report(String msg, Throwable t) {
    System.err.println(msg);
    System.err.println("Reported exception:");
    t.printStackTrace();
  }
  ...
_

reportメソッドは_System.err_に直接書き込みます。回避策は、_System.err_を System.setErr()before最初のLoggerFactory.getLogger()を呼び出しますが、そうすると他の重要なメッセージが失われる可能性があります。

もちろん、ソースをダウンロードしてこれらの_Util.report_呼び出しを削除し、変更したslf4j-apiをプロジェクトで使用することができます。

20
palacsint

警告で参照されているURLを読みましたか?

SLF4J: See [http://www.slf4j.org/codes.html#multiple_bindings][1] for an explanation.

リンクの内容は次のとおりです。

SLF4J APIは、一度に1つだけの基礎となるロギングフレームワークにバインドするように設計されています。クラスパスに複数のバインディングが存在する場合、SLF4Jは警告を発し、それらのバインディングの場所をリストします。この場合、使用するバインディングを1つだけ選択し、他のバインディングを削除します。

たとえば、クラスパスにslf4j-simple-1.6.2.jarとslf4j-nop-1.6.2.jarの両方があり、nop(no-operation)バインディングを使用する場合は、slf4j-simple-を削除します。クラスパスからの1.6.2.jar。

SLF4Jによって発行される警告は、まさにその警告であることに注意してください。 SLF4Jは、クラスパスで最初に見つかったフレームワークと引き続きバインドします。

5
Ceki
    PrintStream filterOut = new PrintStream(System.err) {
        public void println(String l) {
            if (! l.startsWith("SLF4J")) {
                super.println(l);
            }
        }
    };
    System.setErr(filterOut);

etvoilà!

3
ugo

クラスパスから2番目のロガーを除外すると、多くのゆがみが必要になることがあり、警告は非常に煩わしいものになります。プログラムの最初の部分が機能しているように見えるので、標準エラーをマスクします。

    public static void main(String[] args)
    {
        org.Apache.log4j.Logger.getRootLogger().setLevel(org.Apache.log4j.Level.OFF);
        PrintStream old = System.err;
        System.setErr(new PrintStream(new ByteArrayOutputStream()));
        // ... trigger it ...
        System.setErr(old);

        ...

それによってtrigger it partは、ロギングシステムにアクセスするnop関数を呼び出す必要があります。そうしないと、メッセージが生成されます。

プロダクションコードにはお勧めしませんが、skunkworksの目的には役立つはずです。

1
Alex Clark

Mavenを使用する場合は、常にコマンドを使用してください

mvn dependency:tree

これにより、含まれているjarへの依存関係を含め、プロジェクトに追加されたすべての依存関係が一覧表示されます。ここでは、複数のバージョン、または追加された他のjarに付属するjarの複数のコピーを特定できます。使用する

<exclusions><exclusion><groupId></groupId><artifactId></artifactId></exclusion></exclusions>

<dependency>競合するものを除外する要素。問題が解決しない場合は、除外するたびに上記のmavenコマンドを常に再実行してください。

1
Jack

古いバージョンのJetty(たとえば、Jetty 6)を使用している場合は、Webアプリのクラス読み込み順序を変更して、コンテナーよりも優先度を高くする必要がある場合があります。これを行うには、次の行をコンテナのxmlファイルに追加します。

<Set name="parentLoaderPriority">false</Set>
0
Quartz