Spring Boot加载日志记录类的顺序不同

时间:2018-07-30 23:39:46

标签: spring spring-boot slf4j logback-classic

我不确定你们当中有多少人熟悉此方法,但是在两个不同的环境中运行相同的应用程序导致我的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找到多个绑定时,有时会随机选择一个。我删除了其他不必要的依赖关系,从而解决了我的问题。我对为什么相同的应用程序会在具有相同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 

在这种环境中,它以相反的顺序加载两个竞争的记录器,然后应用程序无法启动。有谁知道Spring依赖项加载的行为以及为什么会在不同环境中以不同顺序加载依赖项?这导致此错误在一段时间内未引起注意。两种环境具有相同的linux版本。

预先感谢

0 个答案:

没有答案