解决SLF4J: Class path contains multiple SLF4J bindings问题

在启动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来避免冲突。

解决步骤:

  1. 在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>
  2. 在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依赖。

相关推荐
哦虎!3 小时前
【JavaEE】网络初识
java
for_ever_love__3 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
大鸡腿同学4 小时前
手心向上,手心向下
后端
程序猿追4 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓4 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播4 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
欣栀♡4 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
CCblandy4 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
IT研究室4 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项5 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs