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>
相关推荐
橘猫云计算机设计5 分钟前
基于springboot微信小程序的旅游攻略系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·微信小程序·毕业设计·旅游
落榜程序员6 分钟前
Java 基础-30-单例设计模式:懒汉式与饿汉式
java·开发语言
顾林海7 分钟前
深度解析ArrayList工作原理
android·java·面试
雷渊8 分钟前
spring-IoC容器启动流程源码分析
java·后端·面试
用户33154891110713 分钟前
一招搞定Java线程池炸弹,系统吞吐量暴增10倍!
java·后端
努力的搬砖人.17 分钟前
maven如何使用
java·后端·面试·maven
风象南21 分钟前
SpringBoot中6种跨域请求解决方案
java·spring boot·后端
vivo互联网技术23 分钟前
活动中台系统慢 SQL 治理实践
java·数据库·后端
是小李呀~34 分钟前
【工作梳理】怎么把f12里面的东西导入到postman
java
攀小黑34 分钟前
Java 多线程加锁 synchronized 关键字 字符串当做key
java·开发语言