在启动springboot项目时,遇到了这个问题:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/27932/.m2/repository/ch/qos/logback/logback-classic/1.2.11/logback-classic-1.2.11.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/C:/Users/27932/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.17.2/log4j-slf4j-impl-2.17.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
原因分析:
logback-classic
包和slf4j-log4j12
包,关于org/slf4j/impl/StaticLoggerBinder.class
这个类发生了冲突。其实就是logback
和log4j
之间的冲突。
这是因为springboot
的默认日志是logback
,log4j
在之前是主流日志,很多第三方工具包都引入了log4j
,而我们在开发时会引入很多第三方包,这就造成了冲突。
警告信息在那放着,首先我们应该逐行解读,看看能否找到解决问题的途径。
1、从第一行SLF4J: Class path contains multiple SLF4J providers.我们能知道是在路径下发现了多个SLF4J的绑定。能很容易看出来SLF4J相关的依赖出现了冲突,
后来查阅了一些资料,才知道原来SLF4J本身并没有实现日志相关的功能,而是通过与日志的实现类进行关联绑定才能完成日志的打印等。
2、从警告的第2行和第3行,我们也能看到确实绑定了两个,分别是以下两个ch.qos.logback.classic.spi.LogbackServiceProvider@2459319c
org.slf4j.simple.SimpleServiceProvider@ffaaaf0
3、从日志的最后一行Actual provider is of type [ch.qos.logback.classic.spi.LogbackServiceProvider@2459319c],已经告诉我们了,程序中实际用的是ch.qos.logback.classic.spi.LogbackServiceProvider@2459319
分析了错误警告之后,那就简单了,我们是不是只要知道程序里哪里引用了 “org.slf4j.simple.SimpleServiceProvider@ffaaaf0”这个相关的依赖,并且将他从pom中移除掉,是不是就解决这个问题了呢?那就试试吧。
问题解决:
排除其中一个的依赖。如果使用的是log4j的日志,则只需排序logback的依赖即可。在spring-boot-starter
和spring-boot-starter-web
两个依赖中添加如下内容,排除logback
依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <!-- 排除自带的logback依赖 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除自带的logback依赖 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>