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>
相关推荐
Java码农也是农几秒前
Spring 事务详解:@Transactional 如何生效、何时回滚、传播行为怎么选
java·spring boot·spring·事务
学长毕设44 分钟前
基于SpringBoot的游乐园管理系统-附源码
java·spring boot·后端
SimonKing1 小时前
震惊:怎么回事,opencode一轮对话耗尽免费额度
java·后端·程序员
装不满的克莱因瓶1 小时前
【SpringAI Alibaba】ReactAgent响应SSE实时流式传输案例实战
java·人工智能·ai·sse·springai
杨凯凡1 小时前
Spring Boot 文件上传怎么做才安全?流式落盘、路径校验与数据库一致性实战
java·spring boot·文件上传·后端安全·数据库一致性
这个昵称不容易2 小时前
旅游管理系统的设计与实现(SpringBoot + MySQL + Vue 前后端分离)
java·springboot·毕设
Rain的Java大神之路2 小时前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
天天被压力3 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
天天被压力3 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
Wang's Blog12 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友