教你如何解决因缺少Log4j依赖导致应用启动失败问题技巧分享,日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能十分强大的日志组件,提供方便的日志记录。但这篇文章不是介绍Log4j,本文主要介绍了关于因缺少Log4j依赖导致应用启动失败问题的相关资料,有兴趣的朋友快来详细了解一下吧。
前言
最近该公司正在进行版本升级,并且需要排除依赖于aaa(指内部依赖性)的所有应用程序。从这个角度来看,几乎没有问题,因为它只是排除了一些maven依赖。然而,当一个同学排除了依赖性时,他只排除了aaa,但没有在测试环境中测试它。在线发布时,日志报告dubbo服务注册失败(抛出异常,dubbo管理员没有看到注册服务),导致应用程序无法启动(回滚后正常),影响正常业务5分钟。
事后排查这个问题时发现,有两个原因导致了应用启动失败:
- 去除aaa依赖以后,导致应用有多个slf4j的依赖
- 去除aaa依赖以后,导致log4j依赖缺失(应用使用logback)
第一点很容易解决,因为错误日志可以直接知道原因,修改pom依赖关系并排除非logback实现的日志依赖性。
然而,由于缺乏log4j依赖性,第二点在最终确定之前的一个下午被抛出。
下面把排查过程记录如下:
将应用回滚后正常,那么问题肯定出在回滚以后的提交上,经过和正常版本的代码的diff,发现只有zkclient的版本不同。
异常版本的依赖是如下:
1
2
3
4
5
|
<dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version> 0.1 </version> </dependency> |
正常的依赖是:
1
2
3
4
5
|
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version> 0.10 </version> </dependency> |
com.github.sgroschupf的log框架:
com.101tec的log框架:
然后回到dubbo注册服务失败的问题,一切都很清楚 - 因为log4j依赖关系耗尽,导致dubbo使用zkclient注册服务,因为它无法初始化Log4j,它无法初始化ZkClient,从而导致dubbo注册失败。
通过这个事件,获得如下教训:
- 尽量在一个系统内使用同一个日志框架
- 假如是依赖jar有不同的日志实现,使用更高版本的依赖
- 发布以前一定要记得在测试环境进行测试