转载

Java学习笔记(九)——记录一次关于slf4j的线上问题排查

之前看我文章的小伙伴可能知道,由于我们公司由.net转java,所以我也一直在边做项目边学习java,这里记录一次排查slf4j记录日志相关的问题

遇到的问题

遇到的问题其实很简单,日志文件已经按照规则创建了,但是写不进日志,更奇葩的是在本地调试和QA环境完全没问题,一发布到线上就会出现该问题(QA环境和线上环境能确保的是tomcat和jdk是一样的,其他服务器相关环境略有不同)

排查一:环境问题

首先想到的肯定是服务器环境问题,毕竟本地和测试环境都是ok的嘛。

先看了下权限,确保涉及到目录及文件夹都有 读写权限 。然后又看了JDK和Tomcat的版本,确保运维没有装错。

结果排查了半天,也没发现在环境上有什么不同。

排查二:slf4j配置

接下来又看了代码本身的配置,想看看是不是有什么细小的配置导致问题的根源,在google了很多篇文章后依旧一无所获,基本可以断定配置应该没有问题

排查三:包冲突

确保环境和代码都没问题之后,唯一的可能就是包冲突了,通过idea查看包依赖关系之后发现,确实依赖了两个包 slf4j12slf4j-simple ,看来很有可能是包冲突的关系。

于是在 pom 中将 slf4j-simple 排掉:

Java学习笔记(九)——记录一次关于slf4j的线上问题排查

上线后发现确实解决了该问题。

深挖一下

虽然解决了问题,但还是有困惑,为什么测试环境就可以正常执行,到了线上就不行了呢。

于是我仔细看了下tomcat的启动日志,发现了问题所在(上面一张是线上环境,下面一张是测试环境的)

Java学习笔记(九)——记录一次关于slf4j的线上问题排查

Java学习笔记(九)——记录一次关于slf4j的线上问题排查

可以发现,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在下。

感觉问题又回到了原点。

总结

由于时间有限,这个问题没有再去深入理解,好在问题得到了解决,项目也顺利上线稳定运行了。

但是这个困惑还是希望能解决的,如果有知道的小伙伴可以说明下,近期有时间的话我也会再次研究下的。

原文  http://www.bug2048.com/java20180821/
正文到此结束
Loading...