解决log4j2与logback冲突问题

本文介绍了解决Spring Boot项目中Log4j2与Logback因SLF4J绑定冲突导致的问题。通过调整POM文件中的依赖关系及排除不必要的依赖项来避免启动时出现错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Sprongboot引入pom文件,发现log4j2冲突,pom文件如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <optional>true</optional>
        </dependency>

启动报错:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/maven/mymaven/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:/D:/maven/mymaven/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]

使用idea自带图表依赖项工具排查问题:

 如图所示:

1. spring-boot-starter-logging 被 spring-boot-starter 引用,而 spring-boot-starter 被 spring-boot-starter-web 引用

2.  spring-boot-starter-logging 同时又被 spring-boot-starter-log4j2 引用,这是导致冲突的原因。

解决方案:

1. pom文件注释 spring-boot-starter-log4j2的引用

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-log4j2</artifactId>-->
<!--            <optional>true</optional>-->
<!--        </dependency>-->

2. 屏蔽 spring-boot-starter-web下的 spring-boot-starter-logging

        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <optional>true</optional>
        </dependency>

根据不同使用场景,选择合理方案。

扩展:使用idea扩展工具排查

安装成功后,重启idea,打开pom文件,下面会有一个Dependency Analyzer标签,点击该标签,输入查询冲突包关键字,选择如图按钮:

 这样依赖关系一目了然,再去屏蔽相关依赖。

 

### 解决log4j2logback之间依赖冲突的方法 在Spring Boot项目中,默认的日志框架是Logback,而如果开发者希望切换到Log4j2,则可能会遇到两者之间的依赖冲突问题。以下是详细的解决方法: #### 1. 排除默认的Logback依赖 Spring Boot 默认引入了 `spring-boot-starter-logging`,它包含了 Logback 的实现。为了使用 Log4j2,需要先排除这个默认的 Starter。 可以通过 Maven 或 Gradle 来完成这一操作。以下是一个基于 Maven 的配置示例[^3]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除默认的 logging starter --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加 log4j2 相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ``` #### 2. 防止SLF4J绑定多个日志实现 当类路径中存在多个 SLF4J 绑定时,会抛出警告信息:“Class path contains multiple SLF4J bindings.” 这是因为 SLF4J 不允许同时加载两个不同的日志实现(如 Logback Log4j2)。因此,在引入 Log4j2 的同时,必须确保完全移除了 Logback 及其相关组件[^4]。 可以进一步确认是否有残留的 Logback 依赖项,并通过工具扫描项目的整个依赖树来验证这一点。例如,在 Maven 中运行命令: ```bash mvn dependency:tree | grep logback ``` 如果有任何未预期的结果,请继续调整 POM 文件中的 `<exclusions>` 设置直到清理干净为止。 #### 3. 使用桥接器处理遗留代码兼容性需求 某些情况下,可能仍然有一些第三方库强制绑定了特定版本的日志框架(比如 Logback),此时可考虑采用桥接技术解决问题。具体来说就是加入相应的桥梁 jar 包让这些外部调用重定向至新的目标——即 Log4j2 上面去执行实际功能[^2]。 对于这种情况下的推荐做法如下所示: - 引入 `slf4j-to-jul`, `jcl-over-slf4j` 等转换模块; - 结合上述提到过的排除机制一并实施即可达成目的。 最终完整的 pom.xml 应该看起来像这样: ```xml <dependencies> ... <!-- Spring Web without default Logging --> <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> <!-- Add Log4j2 Support --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- Optional Bridge Dependencies If Needed --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> ... </dependencies> ``` --- ### 总结 以上步骤能够有效帮助开发人员解决 Log4j2 Logback 在同一个应用内的冲突情况。关键是明确了解各个组件的作用范围以及它们相互间的关系之后再采取针对性措施加以规避或者适配改造现有环境使之满足业务场景所需条件[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值