问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Slf4j包老冲突,到底怎么解决?

发布网友 发布时间:2024-09-28 15:14

我来回答

1个回答

热心网友 时间:2天前

一、前言

在进行Java开发时,通常我们会选择Slf4j作为日志门面,但日志实现却不尽相同。如果系统运行中同时存在多个日志实现,就会出现类似下图的Warning。

二、问题原因

我们知道SpringBoot默认使用的日志实现是Logback,因此我们尝试在项目中引入Log4j的依赖时,就复现了上图的报错。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>

上图报错告知我们存在多个SLF4Jbingdings,分别位于logback和log4j包中,有两个StaticLoggerBinder。

我们知道使用Slf4j,需要LoggerFactory.getLogger()方法获取实例。

importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;

privatefinalLoggerlogs=LoggerFactory.getLogger(xxx.class);我们就可以通过这个作为入口,去看看源码的实现。如下图所示,我标注了需要关注的核心代码。

(1)调用getILoggerFactory()方法得到LoggerFactory。

(2)对于首次调用,INITIALIZATION_STATE应该是UNINITIALIZED,所以进入初始化的逻辑,调用方法performInitialization()。

(3)调用bind()方法。

(4)如果不是isAndroid(),调用

findPossibleStaticLoggerBinderPathSet()方法,故名思意,查找可能的staticLoggerBinder,注意这里返回的类型是SET,即可能是多个。

(5)在findPossibleStaticLoggerBinderPathSet()这个方法内,首先通过classLoader加载了org/slf4j/impl/StaticLoggerBinder.class这个类的path,它可能存在多个,因此使用了while获取了所有的path,并最终返回。

(6)reportActualBinding()方法会校验SET的size,如果大于1,就会打印出一开始我们看见的Warning了。

三、问题解决

解决思路就是将你不想要的日志实现从依赖包中排除掉即可,通过IDEA提供的Diagrams能够非常方便的查看项目中的依赖关系。

打开项目的POM文件,右键选择Diagrams->ShowDependencies

假设我们想要排除logback依赖,使用log4j。Ctrl+F搜索logback,可以找到引用该依赖的树形结构。

点击窗口左上角的下图中的这个图标,可以只看当前选中的这个依赖的关系。

选中后效果如下:

如上图所示,logback由spring-boot-starter-logging引入,最顶层是由spring-boot-starter-web和spring-boot-starter-test引入。

我们尝试在spring-boot-starter-web中排除该依赖,应该就可以了。如果排出后重新搜索仍然存在logback依赖,则重复执行排除的操作。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency>四、总结

日志框架冲突特别对于新手来说处理起来比较头疼,因为涉及到了日志接口和日志实现。

我们推崇的应该是面向接口编程,因此我们大到开源项目,小到公司的公共jar包,应当合理利用Maven的传递机制。具体的日志实现不应该传递出去,避免影响到调用的下游方。

<optional>true</optional>

作者:Jitwxs

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求游戏《寂静岭》中好听的游戏配乐,最好是纯音乐 A8 6500 最高支持什么显卡 加条内存组成双通道 对游戏有多大提升... ...追了四个多月了、她也喜欢我。我们俩个在一起也上了床…但是我是... 和喜欢7年的女孩表白后女生说给她点时间,但是又没说什么时间回复我。她... 说一个人很有气质`是什么样的呢` 邢台周边地区的苹果是什么价格 太行百果园地址在哪里? ...时最后香的形状是两边低中间高,这代表什么意思呀?麻烦知..._百度知... 染色体的组成为( )A.DNA和蛋白质B.蛋白质和糖类C.基因和蛋白质D.基 ... 监控器被接入后黑屏的原因 springboot控制台不输出日志? the qoo naver 这些那些那个是韩国的主流讨论地? 韩国有哪些主流网站? 韩国有哪些主流的视频网站? 英语里,“包子”和“馒头”是一个单词吗?应该怎么翻译? 包子和馒头的英标 我的vivoy27手机进水了过两天后能开机了,可是开机后屏幕一闪一闪的,没... 我的手机进水了,一开始能用,后来忽然自动关机,之后就一直黑屏频闪vivo图 ... vivo手机掉水里就拿出来了忘记关机了过了一会自动关机但是还能开机只 ... 英国有哪些大学的服装设计专业好 小米F码是什么?如何获得并使用? 如何在小米商城里使用F码 求去香港游的攻略 男票最近买了工银现金快线,说是工商银行的产品。我说不是,谁来评断一... 不是很懂,现金快线的利息为什么比银行的多呢? 请问我买了工银瑞信超级现金快线为什么每天收益差很多 002202金风科技今天为什么跌这么狠啊?可以补仓吗? 为什么金风科技港股跌了2点几,深圳A股却涨了 金风科技这两天为什么跌这么很?可以买进吗? 工银现金快线是何时推行的 跪求现代校园玄幻小说 女主角多一点 最好男主角无赖一点 谢谢 小米手机F码是干嘛的? 预算1000元以内升级CPU和显卡,帮忙推荐一下。04年的老联想。 我的笔记本电脑有点老,想换一个好点的cpu和声卡,显卡大概要大少钱。请... 片仔癀的什么和什么均受国家秘密保护 片仔癀真的是“救命神药”?它只能治这几种病,别随便乱吃 片仔癀为何对癌症晚期患者有效? 小米官网红米note的F码是什么 红米的F码问题 请问青岛至南通高铁啥时开通? 对系统应用动量定理的方法 ...的罪犯在二年期满后减为15年以上20年以下有期徒刑的条件是... ...死刑缓期执行的罪犯在2年期满后减为25年有期徒刑的条件是( )。 饮食不规律,胃口不舒服可以服用凉血化瘀中成药片仔癀吗? 吃片仔癀的禁忌 50万的彩礼现在来讲真的很多吗 肝癌晚期已经七年多,现在肝区疼痛,能不能用片仔黄 ...没精神,总是亚健康状态,片仔癀有哪些用途?适合我吃吗? 片仔黄的什么受国家保护 片仔癀590一粒是什么药-片仔癀是干嘛的有什么功效