之前看我文章的小伙伴可能知道,由于我们公司由.net转java,所以我也一直在边做项目边学习java,这里记录一次排查slf4j记录日志相关的问题
遇到的问题其实很简单,日志文件已经按照规则创建了,但是写不进日志,更奇葩的是在本地调试和QA环境完全没问题,一发布到线上就会出现该问题(QA环境和线上环境能确保的是tomcat和jdk是一样的,其他服务器相关环境略有不同)
首先想到的肯定是服务器环境问题,毕竟本地和测试环境都是ok的嘛。
先看了下权限,确保涉及到目录及文件夹都有 读写权限
。然后又看了JDK和Tomcat的版本,确保运维没有装错。
结果排查了半天,也没发现在环境上有什么不同。
接下来又看了代码本身的配置,想看看是不是有什么细小的配置导致问题的根源,在google了很多篇文章后依旧一无所获,基本可以断定配置应该没有问题
确保环境和代码都没问题之后,唯一的可能就是包冲突了,通过idea查看包依赖关系之后发现,确实依赖了两个包 slf4j12
与 slf4j-simple
,看来很有可能是包冲突的关系。
于是在 pom
中将 slf4j-simple
排掉:
上线后发现确实解决了该问题。
虽然解决了问题,但还是有困惑,为什么测试环境就可以正常执行,到了线上就不行了呢。
于是我仔细看了下tomcat的启动日志,发现了问题所在(上面一张是线上环境,下面一张是测试环境的)
可以发现,tomcat启动发现了两个包,实际启动加载的是其中之一,正好测试环境加载的是对的,而线上加载的是错的。
那么问题来了,加载的顺序又是根据什么规则呢,于是又google一下发现加载顺序如下:
1. $java_home/lib 目录下的java核心api 2. $java_home/lib/ext 目录下的java扩展jar包 3. java -classpath/-Djava.class.path所指的目录下的类与jar包 4. $CATALINA_HOME/common目录下按照文件夹的顺序从上往下依次加载 5. $CATALINA_HOME/server目录下按照文件夹的顺序从上往下依次加载 6. $CATALINA_BASE/shared目录下按照文件夹的顺序从上往下依次加载 7. 我们的项目路径/WEB-INF/classes下的class文件 8. 我们的项目路径/WEB-INF/lib下的jar文件 在同一个文件夹下,jar包是按顺序从上到下依次加载
根据这个规则,slf4j的两个包都是在/WEB-INF/lib下的,我特意去看了下lib下的jar文件顺序,结果发现两台服务器的jar文件顺序都是slf4j12在上,slf4j-simple在下。
感觉问题又回到了原点。
由于时间有限,这个问题没有再去深入理解,好在问题得到了解决,项目也顺利上线稳定运行了。
但是这个困惑还是希望能解决的,如果有知道的小伙伴可以说明下,近期有时间的话我也会再次研究下的。