springboot换日志框架后爆SLF4J: Class path contains multiple SLF4J bindings的解决办法

sringboot原本使用的是logback日志框架,将它去掉,修改为log4j2日志框架后,往往会出现以下错误:

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in jar:file:/C:/Users/admin/.m2/repository/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:/C:/Users/admin/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar!/org/slf4j/impl/StaticLoggerBinder.class

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

出现这种错误时,项目还能继续运行 ,但是我们会发现log4j.xml的配置并不生效,日志也没有输出到文件里面。并且打包成war包部署到tomcat上也会出现错误,这是由于jar包冲突导致的。

由于多个jar包实现了SLF4J bindings接口,类加载时就出现了歧义。我们只要在pom.xml文件了去除掉引起冲突的引入即可。

最常见的引入冲突是由springboot本身的日志框架引起的。我们可以在pom.xml的

复制代码
spring-boot-starter和spring-boot-starter-web依赖做出以下修改:
复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <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>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

这时候再运行项目,log4j.xml配置就生效了。如果还是报错冲突,那就说明项目还有其他依赖也引入了日志框架,这时我们就需要一步步排查了。

下面是排查步骤:

一、打开pom.xml,在pom文件里点击右键,做出以下选择:

选择之后,会出现类似的一个依赖图:

二、按ctrl+f,出现以下列表,是所有的包

我们前面的冲突是:

SLF4J: Found binding in jar:file:/C:/Users/admin/.m2/repository/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:/C:/Users/admin/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar!/org/slf4j/impl/StaticLoggerBinder.class

所以我们可以查找点击这两个包,看看是哪里引入了这两个包。以springboot-starter-logging为例,这里同时出现了两个包:

双击springboot-starter-logging可以进去查看它的maven文件。

由于springboot-starter-logging的maven配置是springboot自动配置的,不是我们项目的。所以我们看依赖springboot-starter-logging的包springboot starter,双击点进去,就是我们项目的pom文件了。用exclusion去掉springboot-start-logging。groupip和artifactid就是我们刚刚看到的groupid和artifactid了。

复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

其他依赖冲突也是这样解决。如果你exclsuion去掉相关包之后,启动项目报错,说明不是这里冲突,改回来继续修改下一处即可。

相关推荐
骄马之死5 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
GoGeekBaird6 小时前
Anthropic技能"(Skills)的经验分享
后端
王码码20357 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web
郑洁文7 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
螺丝钉code8 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
指令集梦境8 小时前
Cursor + Spring Boot实战:从零写一个RESTful API
spring boot·后端·restful
摇滚侠9 小时前
Maven 入门+高深 单一架构案例 54-59
java·架构·maven·intellij-idea
VidDown9 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
码云之上9 小时前
聊聊如何设计一个高效、稳定的 Node.js 接入层
前端·后端·node.js
折哥的程序人生 · 物流技术专研9 小时前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则