前言
最近公司在做版本升級,所有對aaa(指代某個內部依賴)有依賴的應用需要排除掉。從這點看,幾乎不會有什么問題,因為僅僅是排除一些maven依賴而已嘛。但是,一位同學在排除依賴的時候,僅僅是把aaa排除了,而沒有在測試環(huán)境進行測試,在線上發(fā)布的時候,日志報dubbo服務注冊失敗(拋異常和dubbo admin沒有看到注冊的服務),導致應用啟動失敗(回滾后正常),影響正常業(yè)務5分鐘。
事后排查這個問題的時候發(fā)現(xiàn),有兩個原因導致了應用啟動失敗:
- 去除aaa依賴后,導致應用有多個slf4j的依賴
- 去除aaa依賴后,導致log4j依賴缺失(應用使用logback)
第一點很好解決,因為從error日志可以直接知道原因,修改pom依賴并把非logback實現(xiàn)的日志依賴排掉就好了。
但是,第二點折騰了一下午才最終確定是因為log4j依賴缺失導致的。
下面把排查過程記錄如下:
把應用回滾后正常,那么問題肯定出在回滾之后的提交上,經過和正常版本的代碼的diff,發(fā)現(xiàn)只有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> |
分析到這里,已經有了解決思路,一種是直接修改zkclient的依賴,一種是繼續(xù)分析為什么兩種版本的不同會導致應用啟動失敗。通過繼續(xù)分析,發(fā)現(xiàn)groupId為com.101tec的日志框架使用的是Slf4j,而groupId為com.github.sgroschupf的日志框架是Log4j,而那位同事在排除aaa依賴的時候順便把log4j的依賴也排掉了,所以才導致應用啟動失敗。
com.github.sgroschupf的log框架:
com.101tec的log框架:
再回到剛開始dubbo注冊服務失敗的問題,一切都明了了——因為把log4j依賴排掉了,導致dubbo使用zkclient注冊服務的時候因為無法初始化Log4j,導致無法初始化ZkClient,進而導致dubbo注冊失敗。
通過這個事件,獲得如下教訓:
- 盡量在一個系統(tǒng)內使用同一個日志框架
- 如果是依賴jar有不同的日志實現(xiàn),使用更高版本的依賴
- 發(fā)布之前一定要記得在測試環(huán)境進行測試
總結
以上就是關于因缺少Log4j依賴導致應用啟動失敗的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://blog.csdn.net/u011116672/article/details/68957609