作者:Jitwxs链接:https://jitwxs.cn/e2390047.html1.前言在开发Java的时候,我们通常选择Slf4j作为日志门面,只是日志的实现方式不同。如果系统中有多个日志实现同时运行,会出现类似下图的Warning。2、问题原因我们知道SpringBoot默认使用的日志实现是Logback,所以当我们尝试在项目中引入Log4j依赖时,重现了上面的报错。org.springframework.bootspring-boot-starter-log4j2上面的报错告诉我们有多个SLF4Jbingdings,分别位于logback和log4j包中,有两个StaticLoggerBinder。我们知道使用Slf4j需要LoggerFactory.getLogger()方法来获取实例。导入org.slf4j.Logger;导入org.slf4j.LoggerFactory;私有最终记录器日志=LoggerFactory.getLogger(xxx.class);我们可以以此为入口,查看源码的实现。如下图,我把需要注意的核心代码标出来了。(1)调用getILoggerFactory()方法获取LoggerFactory。(2)第一次调用INITIALIZATION_STATE应该是UNINITIALIZED,所以进入初始化逻辑,调用方法performInitialization()。(3)调用bind()方法。(4)如果不是isAndroid(),调用findPossibleStaticLoggerBinderPathSet()方法,顾名思义,寻找可能的staticLoggerBinders。注意这里返回的类型是SET,也就是可能有多个。(5)在findPossibleStaticLoggerBinderPathSet()方法中,首先通过classLoader加载org/slf4j/impl/StaticLoggerBinder.class类的路径。路径可能有多条,所以用while获取所有路径,最后返回。(6)reportActualBinding()方法将检查SET的大小。如果大于1,就会打印出我们一开始看到的Warning。3.问题解决解决思路是把你不想要的日志实现从依赖包中排除掉。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中排除这个依赖,应该就可以了。如果draining后重新搜索后仍然有logback依赖,则重复排除的操作。<依赖>org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-logging4.总结日志框架冲突,尤其是新手,处理起来很头疼,因为涉及到日志接口和日志实现.我们提倡的应该是面向接口的编程,所以对于小到公司公共jar包的开源项目,我们都应该合理的利用Maven的交付机制。具体日志实现不要外传,以免影响调用的下游方。true近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.不要满屏if/else,试试策略模式,真香!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!