前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java学习笔记(九)——记录一次关于slf4j的线上问题排查

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

作者头像
Bug生活2048
发布2018-08-31 16:02:02
5130
发布2018-08-31 16:02:02
举报
文章被收录于专栏:Bug生活2048Bug生活2048

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

遇到的问题

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

排查一:环境问题

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

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

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

排查二:slf4j配置

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

排查三:包冲突

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

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

截图1

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

深挖一下

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

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

线上环境

测试环境

可以发现,tomcat启动发现了两个包,实际启动加载的是其中之一,正好测试环境加载的是对的,而线上加载的是错的。

那么问题来了,加载的顺序又是根据什么规则呢,于是又google一下发现加载顺序如下:

代码语言:javascript
复制
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在下。

感觉问题又回到了原点。

总结

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Bug生活2048 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 遇到的问题
  • 排查一:环境问题
  • 排查二:slf4j配置
  • 排查三:包冲突
  • 深挖一下
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档