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>
相关推荐
什巳2 小时前
JAVA练习278- 和为 K 的子数组
java·学习·算法·leetcode
豆瓣鸡2 小时前
RocketMQ学习-Spring Boot消息实践
java·spring boot·rocketmq
罗超驿3 小时前
2.算法效率的核心密码:时间复杂度和空间复杂度详解
java·数据结构·算法
栈溢出了3 小时前
Redis 分片集群与哈希槽笔记
java·redis·笔记·spring
遨游DATA4 小时前
Spring Boot 启动失败排查:如何区分多 Bean 冲突与清理阶段异常
java·spring boot·后端
wabs6664 小时前
关于单调栈【力扣739.每日温度的思考】
java·开发语言
雪碧聊技术4 小时前
为什么要学函数式编程?
java·函数式编程
aaPIXa6225 小时前
C++ 用 13 条规则让模型写出安全现代 C++
java·c++·安全
2601_949817726 小时前
C++指针与引用深度精讲:底层原理、差异对比与高阶实战陷阱
java·jvm·c++
va学弟6 小时前
Java 网络通信编程(10):Channel 和 Selector
java·开发语言