log4j2 在移动云上不打日志的问题排查

前言:

自从log4j报出重大漏洞问题升级后,已经出现过两次不兼容问题了

1.和帆软的jar包冲突 

2.和activiti-explorer5.15.1中引用的 slf4j-log4j12冲突(奇怪的是在公司自己服务器和阿里云服务器没问题,在移动云上就不行)

中间内容为转载内容:分析为啥2为啥不兼容。开头和结尾是我自己的总结。

一、发现问题

  1. 开发环境打印日志但生产环境不打印日志这个问题比较棘手。一直找不到原因,后面突然想到在启动的时候打印信息肯定会有所不同。通过在2个环境启动同一个项目的控制台打印信息对比有了以下的发现:
    2.日志打印有两种格式,log4j2只收集了自己的日志,slf4j的日志并没有收集

(1)出现了SL4J的警告信息,都是提示包冲突

org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/apache-tomcat-8.5.75/webapps/mycrm/WEB-INF/lib/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/apache-tomcat-8.5.75/webapps/mycrm/WEB-INF/lib/log4j-slf4j-impl-2.17.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

(2)但是仔细观察发现了加载这两个冲突的jar包的顺序不同,具体见下图:

不打日志的

 打日志的:

SLF4J: Found binding in [jar:file:/usr/local/apache-tomcat-8.5.75/webapps/mycrm/WEB-INF/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/apache-tomcat-8.5.75/webapps/mycrm/WEB-INF/lib/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]

二、分析

  • 在开发环境,先加载的是log4j-slf4j-impl,后加载的是slf4j-log4j12。而生产环境,先加载的是slf4j-log4j12,后加载的是log4j-slf4j-impl。

  • 通过查阅官方资料发现slf4j在绑定时,如果有多个可以绑定的包,SLF4J选择绑定的方式由JVM确定,并且出于所有实际目的应该被认为是随机的。

  • 但是,经过我12次在slf4j源码打断点测试发现slf4j优先绑定先加载的jar包。所以在开发环境slf4j绑定的是log4j-slf4j-impl这个jar包,而在生产环境中绑定的是slf4j-log4j12这个jar包。

  • 通过查阅log4j2官方资料可知,slf4j集成log4j2时需要的桥接包是log4j-slf4j-impl。开发环境中slf4j绑定是正确的,因此可以打印日志。而生产环境中slf4j绑定的jar包是slf4j-log4j12。所以生产环境输出不了日志。产生这个问题的根本原因是lib里面有多个了slf4j可绑定的jar包。

三、解决方案

由于是slf4j绑定jar包错误而导致打印不了日志。所以我们必须要把这个slf4j-log4j12.jar包排除干净。这个包主要来源有:

(1)framework-logger(公司自己封装的框架)

(2)zkclient

(3)zookeeper

(4)activiti

排除完jar包后,本地进行打包。打包完成后,必须要检查一遍,看一下生成的打包文件的lib文件夹下是否还存在slf4j-log4j12.jar。如果有,应该是jar包没排除干净。可以通过maven命令查看依赖树,看看是那个依赖把这个jar给传递进来的。命令为:dependency:tree

四、小结

(1)使用SLF4j+Log4j2时使用的桥接包是log4j-slf4j-impl

(2)当有多个SLF4j的桥接包时,一定要排除不需要的包

(2)项目启动时控制台输出的信息很重要,耐心观察启动日志可以解决很多问题

转载自:https://www.cnblogs.com/zeng1994/p/df2559e6dc66c99065676e0ee70545eb.html

自己总结怎么排查不兼容问题:

1.根据启动日志查出不兼容警示,或者错误日志 找到不兼容的jar包

2.通过idea的 Maven Helper 分析依赖关系,高版本自带,

这里面飘黄的就是有冲突了,点开可看到谁和谁冲突

3.查看依赖包关系图

最后找到slf4j-log4j12 这个冲突包在 activiti-explorer,在 activiti-explorer里 去除slf4j-log4j12 引用即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值