在启动SpringBoot项目时,遇到了SLF4J和logback的冲突问题。问题的原因是类路径下存在多个SLF4J绑定。本文将详细分析问题的原因以及如何解决它。
问题描述:
在启动Spring Boot项目时,控制台报错如下:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/Program%20Files/JavaEclipse/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/Program%20Files/JavaEclipse/repo/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.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]
另外,日志系统初始化失败,并报如下错误:
Logging system failed to initialize using configuration from 'classpath:log4j.properties'
java.lang.IllegalStateException: Could not initialize Logback logging from classpath:log4j.properties
原因分析:
出现此问题的原因是logback-classic
包和slf4j-log4j12
包之间发生了冲突,特别是org/slf4j/impl/StaticLoggerBinder.class
这个类。
Spring Boot 默认使用的是logback作为日志框架,而log4j曾经是主流的日志框架,很多第三方工具包都会引入log4j。由于开发时引入了多个第三方包,就会导致logback和log4j之间的冲突。
问题解决:排除其中一个的依赖
如果你决定使用log4j作为日志框架,那么需要排除Spring Boot默认的logback依赖。可以通过在spring-boot-starter
和spring-boot-starter-web
的依赖中排除spring-boot-starter-logging
来避免冲突。
解决步骤:
-
在
spring-boot-starter
依赖中排除spring-boot-starter-logging
:xml<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>
-
在
spring-boot-starter-web
依赖中也排除spring-boot-starter-logging
:xml<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>
注意: 上述排除操作需要在两个依赖中都进行。
总结
当Spring Boot项目中出现SLF4J: Class path contains multiple SLF4J bindings
的错误时,通常是因为logback-classic
和slf4j-log4j12
包发生了冲突。通过排除其中一个日志框架的依赖,可以解决该问题。如果选择使用log4j,可以排除默认的logback依赖。