在进行 Java 开发时,通常我们会选择 Slf4j 作为日志门面,但日志实现却不尽相同。如果系统运行中同时存在多个日志实现,就会出现类似下图的 Warning。
二、问题原因
我们知道 SpringBoot 默认使用的日志实现是 Logback,因此我们尝试在项目中引入 Log4j 的依赖时,就复现了上图的报错。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
上图报错告知我们存在多个 SLF4J bingdings,分别位于 logback 和 log4j 包中,有两个 StaticLoggerBinder。
我们知道使用 Slf4j ,需要 LoggerFactory.getLogger() 方法获取实例。
import org.slf4j.Logger
import org.slf4j.LoggerFactory
private final Logger logs = 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 ->Show Dependencies
假设我们想要排除 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>`
转载至:https://jitwxs.cn/e2390047.html
编辑于 2021-01-30 · 著作权归作者所有
赞同 4
评论
相关推荐
如果只推荐一款成猫粮,你会推荐哪款?进口猫粮蓝馔、渴望、爱肯拿、美士哪个牌子好?2022高性价比成猫粮选购推荐(12月更)
过去一年,我自费近万元,从国产卫仕到进口蓝馔、渴望,测试不下15款猫粮,就是为了给家里2个挑食肠胃又傲娇的猫主子,找到一款最合适的口粮。养宠6年负责任的说,猫咪生病90%的原因都来自于猫粮,品质不好的猫粮营养不均衡,猫咪吃了容易生病,到医院花大钱不说,关键是孩子受罪,我们也跟着操心。而选择一款好的猫粮,更好的为猫咪补充身体需要的营养同时,猫咪爱吃长时间身体健康不生病,毛色亮精神好,排便不软便,铲屎...
阿多尼斯船长的回答
鼻子黑头巨多!有什么逆天好用的去黑头泥膜?
比手挤还要见效的去黑头方法总共就10来分钟,这辈子都不用和黑头打交道了!我说的这个不用和黑头打交道,单纯指的是在定期的清洁维护下黑头不会在脸上出现,并不是指搞一次清洁后黑头就永远消失了毕竟黑头是油脂氧化后的产物,只要咱皮肤正常分泌油脂,这玩意儿就一直是会存在的但是!哥们我现在一个月只需要定期清洁那么几次,别说黑头了,痘痘闭口粉刺都很少见!一年四季整张脸基本都是干干净净的先重度提醒一下闭坑环节知道有...
我有3千万的回答
【敏感肌面霜大PK】6款敏感肌面霜大实测,帮你选择最适合的敏感肌面霜
史上最全干货!作为敏感肌大红脸,5年来我已经买过30多款面霜,这次就把敏皮护肤指南给大家掰扯透!!原创内容不接受转载,定期更新。目前在榜的是:6款口碑好or热度高的敏感肌面霜,价位在几十到几百不等,成分和使用体验都会尽可能详细的补充。如果有什么方面没涉及到,或者有什么牌子想问的,大家可以直接留言,我会接着更新,后面还有敏皮需get的基础知识,姐妹们可以点点收藏,以防走丢~6个产品的基本信息摸良心讲...
一只奈良小鹿几的回答
2022年孕妇沐浴露榜单安利:孕期安全又好用的沐浴露TOP10榜来喽~拒绝智商税,警惕“黑名单”沐浴露钻空!!
前言:本文主旨是帮助大家挑选适合安全又好用的孕妇沐浴露,不刻意营销吹捧,实实在在分享我接触过,或身边怀孕妈妈接触过的孕妇沐浴露分享给大家,仅供参考~不管外面对所谓“孕妇专用”营销的有多火!大家只需要记住一条:孕妇是否需要用专门的沐浴露要根据自身的情况而定。像体质好并且平时没有被孕反影响的孕妈,之前的沐浴露用的又是安全、低刺激的产品,那就没必要再更换其它牌子的沐浴露。但是如果你用的是什么L士、舒F佳...
糯米团团的回答
高度近视吃叶黄素有用吗?
爱次溜溜梅的回答
经常掉头发,怎么能让发量变多?Onuy育发液真的有用吗?
我是真没想到,一个几十块的育发液能这么好用,直接拯救了我们“濒危”的头发!一不小心获得让头发变多的技能,实在忍不住了,发出来浅浅的嘚瑟嘚瑟:其实老早以前我也算是个能炫耀发量的女生,BUT,自从工作了后天天加班、熬夜,不知不觉中头发都快熬没了。为了头发这事儿,我也是下了狠心,防脱套装、#发仪,某凝胶,以及各种养发馆,还有什么生姜擦头皮,侧柏叶煮水洗头好多偏方,我都试过用处都不大!后来还是刷小红薯的...
月野的回答
2023年壁挂炉选购攻略,家用壁挂炉怎么选?哪种壁挂炉更节能,功率如何选?家用壁挂炉选购看这一篇就够了
贴地飞行的回答
夫妻感情不合面临离婚?教你正确挽救婚姻全攻略
从事情感咨询多年,我发现很多的病入膏肓的婚姻都是“拖”出来的,归根于很多人遇到婚姻问题时缺乏合理有效的方法,导致问题愈演愈烈。为此我专门做了下面的这个链接,如果你对自己的感情问题拿捏不准,可以点击链接卡片获取咨询联系方式,进行一次详细的咨询分析。有需要的伙伴可以点击获取。https://xg.zhihu.com/plugin/d59d60cb7fb0bc466fa24818a474d75a?BIZ...
林然 心理咨询师的回答
有什么沐浴露可以把自己腌入味?
桃花仙的回答
奇遇MIX VR一体机,一款具有混合现实(MR)功能的消费级VR一体机,VR和MR的融合,将带来哪些新奇的体验?(内有奇遇MIX VR一体机上手体验及测评)
王之葵托利的回答
收起
大家还在搜
苹果ssl错误怎么办
slf4j和log4j区别
creo突出显示的2尺寸冲突
如何解决约束和尺寸冲突
slf4j官网
处理冲突的5种方式
@slf4j
草图包含冲突的约束怎么办
解决价值冲突的主要原则
slf4j怎么读
s m a r t原则包括
初中生如何处理矛盾冲突
越狱后ssl错误
iphone发生了ssl错误
冲突的四个原则
处理冲突的原则有哪些
ssl错误是什么意思
f t分别代表对错
无法加载发生了ssl错误
ssl错误无法建立安全连接
处理冲突的原则包括智慧树
处理学生冲突遵循的原则
处理人际冲突的原则有哪些
处理学生冲突的基本要求
相关推荐
jar包冲突解决:SLF4J: Class path contains multiple bindings._知乎
配置完springboot项目启动后报错:SLF4J: Class path contains multiple SLF4J bindings.Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j原因:slf4j日志jar包冲突解决思路:从上图可以看出三...
slf4j包冲突问题_知乎
java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format百度上面查到的::原因可能有两个:1、jar包冲突,build path下可能加入了 slf4j-log4或者 log4j的jar包,删除即可.2、jar包版本导致的,例如 如果你的Logback是1.0.6版本,...
一个解决jar包冲突的实现方案_知乎
0.概述 fat-jar是将一个jar所依赖的jar都内嵌在它的jar包中而重新打包成的新jar.内嵌的jar只能被jat-jar包内的资源引用,因此jat-jar可以有效的解决jar包冲突. 例如:...
是时候跟NoSuchMethodError说再见了_知乎
看到异常信息后,第一反应是这种问题99.9999%的原因是maven依赖包有不兼容的问题.不过用idea的Dependency Analyzer排查时发现根本就不存在有冲突的包.这下发现遇到真问题了....
JAR包冲突解决的思路_知乎
一.什么情况下会产生JAR包冲突二.JAR包冲突解决的一般思路1.版本选择(1)优先使用较高版本(2)查看版本的依赖, 选择依赖版本与项目J
欢迎分享,转载请注明来源:优选云