深入理解Logger日志——框架绑定原理( 二 )


以下是个人收集一些比较简单好理解的 绑定关系图, 体现了 StaticLoggerBinder 绑定的重要性
深入理解Logger日志——框架绑定原理文章插图
深入理解Logger日志——框架绑定原理文章插图
绑定过程中所遇到的问题1、Log4j和Log4j2需要配置好log4j.xml和log4j2.xml文件 , 不然无法正常使用 , Logback可以正常使用
2、与SpringBoot的spring-boot-starter中的依赖spring-boot-starter-logging内部的依赖 Logback 产生冲突(可以自己点击查看一番)
Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/Users/zhouguanglin/.m2/repository/org/slf4j/slf4j-log4j12/1.7.29/slf4j-log4j12-1.7.29.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactoryat org.springframework.util.Assert.instanceCheckFailed(Assert.java:699)at org.springframework.util.Assert.isInstanceOf(Assert.java:599)at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:284)at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:104)at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:232)at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:213)主要原因是:SpringBoot所使用的搭配日志框架是Logback
若是项目使用SpringBoot但搭配的是其他日志框架A , 由StaticLoggerBinder.getSingleton().getLoggerFactory()获取的是搭配框架A的实现 , 导致与SpringBoot内部自身搭配的Logback产生冲突 , 可以进入报错地方查看 。
深入理解Logger日志——框架绑定原理文章插图
从代码逻辑中可以发现 , Assert.isInstanceOf 判断获取得到的ILoggerFactory的实现类必须是LoggerContext 才OK , 硬性规定不然就会报错 。
解决方案:只要在SpringBoot中排除Logback的依赖就OK , 如下:
【深入理解Logger日志——框架绑定原理】org.springframework.bootspring-boot-starterlogback-classicch.qos.logback


推荐阅读