无法打出log4j日志的问题排查
?
<!--[endif]-->
jcl-over-slf4j的桥接实现是利用了JCL创建LoggerFactory的第二条规则,基于Service ProviderInterface(SPI) 类发现机制,在jcl-over-slf4j/META-INF/services/org.apache.commons.logging.LogFactory文件中定义了LoggerFactory的实现为SLF4JLogFactory,由SLF4JLogFactory去执行SLF4J的日志系统绑定过程。
?
把上面理清楚之后,我遇到的问题就迎刃而解了。试用一直都是使用JCL+log4j,日志功能一直都很ok。直到某一天使用了eaglewing,它同时依赖了logback-classic、logback-core、slf4j-api、jcl-over-slf4j。当它依赖了jcl-over-slf4j之后,悲剧就可能发生,因为对于JCL的调用都被重定向到slf4j,具体的日志系统则是由slf4j的绑定规则实现。从slf4j的绑定规则可以知道,当classpath中只有logback-classic、slf4j-log4j12和slf4j-jdk14的其中一种时,绑定的结果很明确。但是当出现两个以上时,就会出现多种可能性,取决于classloader先加载到了哪个StaticLoggerBinder。
刚好系统jar包依赖里同时出现了logback-classic、logback-core 、slf4j-log4j12、jcl-over-slf4j、slf4j-api等,也就导致了我本机打不出log、daily打出log的现象,因为我本机碰巧绑定了logback,log4j.xml配置的信息无效;而daily刚好绑定了slf4j-log4j12,顺利的打出了log4j的log。
解决的办法就是把eagle wing对logback的依赖exclude掉,这样就保证了slf4j能绑定到log4j。