これに精通している方がどれだけいるかはわかりませんが、2 つの異なる環境で同じアプリケーションを実行すると、Spring Boot アプリがログの依存関係を異なる順序で読み込むようになります。logback-classic-1.1.7 と slfj4j-log4j12-1.7.13 で実行しています。
これで、logback に slfj が埋め込まれていることがわかりました (少なくとも、今はそうしています)。通常、複数のバインディングの警告が表示され、処理が続行されます。アプリが起動します。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/root/dev2/target/lib/logback-classic-
1.1.7.jar! /org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/root/dev2/target/lib/
slf4j/slf4j-jdk14/1.5.3/slf4j-jdk14 1.5.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Actual binding is of type
[ch.qos.logback.classic.util.ContextSelectorStaticBinder]
//Spring then starts the app successfully here.
slf4j が複数のバインディングを見つけると、ランダムに 1 つを選択することがあると読んだことがあります。他の不要な依存関係を削除したので、問題は解決しました。同じLinuxバージョンの別のサーバーで実行することにより、同じアプリが間違ったロガーをロードする理由にもっと興味があります。別の環境で実行している場合、起動しようとすると次のようになります。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/root/dev3/target/lib/
slf4j/slf4j-jdk14/1.5.3/slf4j-jdk14 1.5.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/root/dev3/target/lib/logback-classic-
1.1.7.jar! /org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Actual binding is of type
[org.slf4j.impl.Log4jLoggerFactory]
Exception is in thread "main" java.lang.IllegalArgumentException: LoggerFactory
is not a Logback LoggerContext but Logback is on the classpath.
Either remove Logback or the competing
implemenataion (class org.slf4j.iml.Log4jLoggerFactory...
//app then fails to start
この環境では、競合する 2 つのロガーが逆の順序で読み込まれ、アプリの起動に失敗します。Spring の依存関係のロードの動作と、異なる環境で異なる順序でそれらをロードする理由について詳しく知っている人はいますか? これにより、このエラーはしばらく気付かれませんでした。両方の環境の Linux バージョンは同じです。
前もって感謝します