slf4j依赖冲突处理

文章目录

为了所有代码的日志统一使用一个配置来控制输出,需要进行日志相关依赖的整理

使用logback输出日志

spring应用默认的日志输出工具;

项目依赖

复制代码
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

兼容使用log4j(v1)的代码

如果项目的某个依赖传递引入了log4j、reload4j,证明这个依赖在使用log4j(v1)的loggerFactory;

如果希望这个依赖里的代码打印的日志由logback控制输出,需包含的依赖如下:

复制代码
<dependency>
    <!-- 提供log4j(v1)的api,slf4j介入实际输出 -->
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>

需排除的依赖:

复制代码
            <exclusions>
                <exclusion>
                    <!-- log4j(v1)的api+核心功能 -->
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <!-- 避免slf4j最终绑定到log4j(v1) -->
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <!-- log4j(v1)的安全漏洞修复版 -->
                    <groupId>ch.qos.reload4j</groupId>
                    <artifactId>reload4j</artifactId>
                </exclusion>
                <exclusion>
                    <!-- 避免slf4j最终绑定到log4j(v1) -->
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-reload4j</artifactId>
                </exclusion>
            </exclusions>

兼容使用jcl的代码

需包含的依赖:

复制代码
<dependency>
    <!-- 提供commons-logging的api,slf4j介入实际输出 -->
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>

需排除的依赖:

复制代码
            <exclusions>
                <exclusion>
                    <!-- jcl的api+核心功能 -->
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
                <exclusion>
                    <!-- 避免slf4j最终绑定到jcl -->
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-jcl</artifactId>
                </exclusion>
            </exclusions>

兼容使用log4j(v2)的代码

需包含的依赖:

复制代码
<dependency>
    <!-- 提供log4j(v2)的api -->
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <!-- 实际输出交接给slf4j -->
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>${log4j2.version}</version>
</dependency>

需排除的依赖:

复制代码
            <exclusions>
                <exclusion>
                    <!-- log4j(v2)的核心功能 -->
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                </exclusion>
                <exclusion>
                    <!-- 避免slf4j最终绑定到log4j(v2) -->
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
            </exclusions>

使用log4j(v2)输出日志

hive3默认的日志输出工具;

项目依赖

复制代码
<dependency>
    <!-- 传递引入log4j-api和log4j-core -->
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>${log4j2.version}</version>
</dependency>

兼容使用log4j(v1)的代码

需包含的依赖:

复制代码
<dependency>
    <!-- 提供log4j(v1)的api,slf4j介入实际输出 -->
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>

需排除的依赖:

复制代码
            <exclusions>
                <exclusion>
                    <!-- log4j(v1)的api+核心功能 -->
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <!-- 避免slf4j最终绑定到log4j(v1) -->
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <!-- log4j(v1)的安全漏洞修复版 -->
                    <groupId>ch.qos.reload4j</groupId>
                    <artifactId>reload4j</artifactId>
                </exclusion>
                <exclusion>
                    <!-- 避免slf4j最终绑定到log4j(v1) -->
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-reload4j</artifactId>
                </exclusion>
            </exclusions>

兼容使用jcl的代码

需包含的依赖:

复制代码
<dependency>
    <!-- 提供commons-logging的api,slf4j介入实际输出 -->
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>

需排除的依赖:

复制代码
            <exclusions>
                <exclusion>
                    <!-- jcl的api+核心功能 -->
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
                <exclusion>
                    <!-- 避免slf4j最终绑定到jcl -->
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-jcl</artifactId>
                </exclusion>
            </exclusions>

兼容使用logback的代码

排除依赖即可,logback并不提供专用的loggerFactory来初始化logger对象

复制代码
            <exclusions>
                <exclusion>
                    <!-- 避免slf4j最终绑定到logback -->
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
相关推荐
大学生资源网9 分钟前
java毕业设计之儿童福利院管理系统的设计与实现(源码+)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计
JasmineWr9 分钟前
JVM栈空间的使用和优化
java·开发语言
Hello.Reader13 分钟前
Flink SQL DELETE 语句批模式行级删除、连接器能力要求与实战避坑(含 Java 示例)
java·sql·flink
爱笑的眼睛1117 分钟前
从 Seq2Seq 到 Transformer++:深度解构与自构建现代机器翻译核心组件
java·人工智能·python·ai
Spring AI学习24 分钟前
Spring AI深度解析(10/50):多模态应用开发实战
java·spring·ai
qq_12498707533 小时前
重庆三峡学院图书资料管理系统设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·spring·毕业设计
大学生资源网3 小时前
java毕业设计之“知语”花卉销售网站的设计与实现源码(源代码+文档)
java·mysql·毕业设计·源码·springboot
小鸡脚来咯3 小时前
Redis三大问题:穿透、击穿、雪崩(实战解析)
java·spring·mybatis
桦说编程3 小时前
并发编程高级技巧:运行时检测死锁,告别死锁焦虑
java·后端·性能优化
jiayong233 小时前
Spring AI Alibaba 深度解析(三):实战示例与最佳实践
java·人工智能·spring