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去掉相关包之后,启动项目报错,说明不是这里冲突,改回来继续修改下一处即可。

相关推荐
小龙报3 分钟前
【Coze-AI智能体平台】低代码省时高效:Coze 应用开发全流程指南
java·人工智能·python·深度学习·低代码·chatgpt·交互
陈随易8 分钟前
bun将会支持Bun.image,你怎么看?
前端·后端·程序员
念何架构之路17 分钟前
Go Web基础和Http演进
开发语言·后端·golang
勿忘初心122120 分钟前
【Java实战】SpringBoot 集成 freemarker 导出 Word 模板
java·spring boot·freemarker·模板引擎·word导出·后端实战
绿草在线25 分钟前
SpringBoot项目实战:从零搭建高效开发环境
java·spring boot·后端
J2虾虾27 分钟前
Java Lambda 表达式详解文档
java·开发语言
longxibo32 分钟前
【第1章 环境搭建与项目结构解析】
java·后端·流程图
a***728933 分钟前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
Java成神之路-38 分钟前
面试题:Spring AOP底层实现原理
java·spring aop
Python私教41 分钟前
如意Agent日志系统重构:从 print() 大海捞针到结构化可观测性栈
java·前端·重构