slf4j依赖冲突处理

ops/2024/10/22 12:22:47/

文章目录

  • 使用logback输出日志
    • 项目依赖
    • 兼容使用log4j(v1)的代码
    • 兼容使用jcl的代码
    • 兼容使用log4j(v2)的代码
  • 使用log4j(v2)输出日志
    • 项目依赖
    • 兼容使用log4j(v1)的代码
    • 兼容使用jcl的代码
    • 兼容使用logback的代码

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

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

http://www.ppmy.cn/ops/112841.html

相关文章

MATLAB中的代码覆盖测试:深入指南与实践应用

在软件测试领域&#xff0c;代码覆盖测试是一种重要的技术&#xff0c;用于评估测试用例的完整性和有效性。在MATLAB环境中&#xff0c;代码覆盖测试可以帮助开发者确保他们的代码在各种条件下都能正常工作&#xff0c;并且能够发现可能被忽视的错误。本文将详细介绍如何在MATL…

Java入门程序-HelloWorld

Java程序开发的三个步骤 1.编写代码得到 .java 源代码文件 2.使用javac编译得到 .class 字节码文件 3.使用java运行 注意事项 建议代码文件名全英文&#xff0c;首字母大写&#xff0c;满足驼峰命名法&#xff0c;源代码文件的后缀必须是.java 开发HelloWorld程序 &…

MYSQL数据库基础篇——DDL

DDL&#xff1a;DDL是数据定义语言&#xff0c;用来定义数据库对象。 一.DDL操作数据库 1.查询 ①查询所有数据库 输入&#xff1b; 得到结果&#xff1a; ②查询当前数据库 输入&#xff1b; 例如执行下面语句&#xff1a; 2.创建 输入 然后展示数据库即可得到结果&…

初写MySQL四张表:(3/4)

我们已经完成了四张表的创建&#xff0c;学会了创建表和查看表字段信息的语句。 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)-CSDN博客 接下来&#xff0c;我们来学点对数据的操作&#xff1a;增 删 查&#xff08;一部分&#xff09;改 先来看这四张表以及相关…

XML映射器-动态sql

01-动态sql 1.实现动态条件SQL 第一种方法在sql语句中加入where 11其他条件都加and就行,这样就可以根据if条件来判断要传递的参数可以有几个 第二种方法用where标签给if语句包起来 where标签的作用如下图 第三种方法用trim标签解释如下图 用choose也可以实现条件查询如下图,…

【鸿蒙 HarmonyOS NEXT】组件嵌套滚动:nestedScroll

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-syst…

git一个项目关联多个远程仓库

一行代码就行&#xff1a; git remote set-url origin [想要关联的远程仓库地址]想要关联哪个就切换哪个 或者不用每次切换&#xff0c;集中管理&#xff1a; Git->Manage Remotes 点击“”&#xff0c;填入Name和想要关联的远程库地址 每次push时执行命令 git push [为…

Mysql 视图存储过程触发器

初识&#xff1a; 在 MySQL 中&#xff0c;视图(View)、存储过程(Stored Procedure)和触发器(Trigger)是用于管理和操作数据库的高级功能。它们各自有不同的用途和优势。 2. 视图 (View) 视图是一个虚拟表&#xff0c;它是从一个或多个表中获取数据的结果。视图并不存储数据本…