1、bug現象:生產環境,日誌級別不受控,瘋狂打印debug級別的日誌,也連不到日誌平臺kibana。
此時已不能回滾,因爲,新上的RPC接口,已經被別的系統依賴。
除了日誌問題,其它一切正常。 所以當前方法是,趕緊找到問題所在,解決掉。
2、將生產問題嘗試在測試環境復現
結果:容器雲環境的測試環境復現了此問題(生產環境也是在容器雲);
Jenkins環境的測試環境未復現、本地啓動也未復現;
至此,不禁打了個問號,感覺是jar包衝突.....
3、排查1:一開始以爲是jar包衝突,就使用maven helper插件,把所有衝突的jar包都exclusion解決掉,還是不行。
4、排查2:覺得剛纔的解決方法太籠統,沒有針對這個問題點進行排查問題;
就仔細看了下一開始的啓動日誌,發現是slf4j和logback的jar包衝突了,見下圖;網上查了下 ,也有相似問題;
至此定位到問題。
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Listening for transport dt_socket at address: 8002
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/bestapp/apache-tomcat-8.5.23/webapps/ROOT/WEB-INF/lib/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/bestapp/apache-tomcat-8.5.23/webapps/ROOT/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
14:06:26.781 [localhost-startStop-1] INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization started
14:06:26.990 [localhost-startStop-1] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Adding [servletConfigInitParams] PropertySource with lowest search precedence
14:06:26.990 [localhost-startStop-1] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Adding [servletContextInitParams] PropertySource with lowest search precedence
5、解決問題: 找logback-classic-1.1.11 ,排掉
(1)看pom文件裏的依賴,沒找到
(2)看pom文件裏的間接依賴,沒找到
(3)使用“mvn dependency:tree”,沒找到
至此,陷入困境............. 這個 logback-classic-1.1.11.jar 包從何而來呢 ???????
(4)換個思路,直接解壓war包,果然在目錄 /webapps/ROOT/WEB-INF/lib 下發現了 logback-classic-1.1.11.jar 。
至此,又陷入疑問,你到底從何而來呢,又各種查找,還是沒找到它,包括讓容器組的人查,也沒查到原因,畢竟是只有在容器雲環境纔會出現這種問題(真的是用了各種方法)
(5)最後因爲急於解決生產的問題,所以用了個臨時方法,就是:在編譯階段把打包後的war包,解壓,然後進入目錄tomcat/webapps/ROOT/WEB-INF/lib,手動刪除logback-classic-1.1.11.jar,然後再打包,見下圖:
測試環境,驗證通過後,發佈生產,問題解決。
但至於爲什麼只有在容器環境,纔會在war包裏出現這個logback的jar包,這個問題,有時間還得繼續研究下。
6、總結:
解決bug,要抓住問題關鍵點,不要想當然;
遇到困境,跳出來,換個角度。