在进行Java开发时,我们通常会选择SLF4J作为日志的外墙,但是日志实现不是相同的。如果在系统运行过程中有多个日志实现,则会显示下图的警告。
我们知道Springboot默认使用的日志实现是logBack,因此当我们尝试在项目中介绍Log4J的依赖项时,我们在上图中重现了错误。
上图报道说,分别位于logback和log4j软件包中的多个SLF4J bingdings,两个staticloggerbinder。
我们知道,使用slf4j,我们需要loggerfactory.getlogger()方法来获得实例。
私有最终记录器logs = loggerfactory.getLogger(xxx.class);我们可以将源代码的实现视为入口。如下图所示,我标记了需要注意的核心代码。
(1)调用getilogerFactory()方法获取LoggerFactory。
(2)对于第一个呼叫,初始化_STATE应该是非初始化的,因此请输入初始化的逻辑,呼叫方法performitification()。
(3)调用bind()方法。
(4)如果不是isandroid(),请致电
findPossiblestaticLoggerBinderPathet()方法,因此,找到可能的staticloggerbinder,请注意,此处返回的类型是设置的,可能是多个。
(5)在FindPossiblestaticLoggerBinderPatheet()的方法中,首先加载了ORG/SLF4J/IMPH/staticloggerbinder.class.class.class.class,该classloader可能具有多个Paile,并最终返回。
(6)ReportActualBinding()方法将检查集合的大小。如果大于1,它将打印我们一开始看到的警告。
解决方案是删除您不想从依赖项软件包中消除的日志。想法提供的图表非常方便地查看项目中的依赖项。
打开项目的POM文件,右键 - 单击选择图 - >显示依赖项
假设我们要排除记录依赖项,并使用log4j.ctrl + f搜索logback来查找引用它的依赖树结构。
单击窗口左下角的图标,仅查看当前选择的因关系。
效果如下所示:
如上图所示,弹簧启动启动器引入了记录。顶层由Spring-Boot-Starter-Web和Spring-Boot-Starter测试引入。
我们试图在Spring-Boot-Starter-Web中排除依赖项,并且应该很好。如果搜索在放电后仍具有记录依赖项,则反复执行排除操作。
日志框架冲突对于新手来说尤其令人头疼,因为它涉及日志记录和日志实现。
我们欣赏的是面向接口的编程,因此我们是大型开源项目,并且公司的公共JAR包应该合理地使用Maven的传输机制。不应传递特定的日志实现,以避免影响呼叫下游。
作者:jitwxs