記一次項目上線后Log4j2不輸出日志的坑

一、發(fā)現(xiàn)問題

  1. 開發(fā)環(huán)境打印日志但生產(chǎn)環(huán)境不打印日志這個問題比較棘手。一直找不到原因,后面突然想到在啟動的時候打印信息肯定會有所不同。通過在2個環(huán)境啟動同一個項目的控制臺打印信息對比有了以下的發(fā)現(xiàn):
    2.日志打印有兩種格式,log4j2只收集了自己的日志,slf4j的日志并沒有收集

(1)出現(xiàn)了SL4J的警告信息,都是提示包沖突

        Multiple bindings were found on the class path

(2)但是仔細觀察發(fā)現(xiàn)了加載這兩個沖突的jar包的順序不同,具體見下圖:

**①開發(fā)環(huán)境日志沖突jar包加載順序圖**
image
    防止圖失效,我把文字復制過來了

SLF4J:Class path contains mutiple SLF4J bindings

SLF4J:Found binding in[jar:file:/WEB-INF/lib/log4j-slf4j-impl-2.6.6.jar!/org/slf4j/impl/StaticLoggerBider.class]

SLF4J:Found binding in[jar:file:/WEB-INF/lib/slf4j-log4j12-1.7.22.jar!/org/slf4j/impl/StaticLoggerBider.class]

二、分析

  • 在開發(fā)環(huán)境,先加載的是log4j-slf4j-impl,后加載的是slf4j-log4j12。而生產(chǎn)環(huán)境,先加載的是slf4j-log4j12,后加載的是log4j-slf4j-impl。

  • 通過查閱官方資料發(fā)現(xiàn)slf4j在綁定時,如果有多個可以綁定的包,SLF4J選擇綁定的方式由JVM確定,并且出于所有實際目的應該被認為是隨機的。

  • 但是,經(jīng)過我12次在slf4j源碼打斷點測試發(fā)現(xiàn)slf4j優(yōu)先綁定先加載的jar包。所以在開發(fā)環(huán)境slf4j綁定的是log4j-slf4j-impl這個jar包,而在生產(chǎn)環(huán)境中綁定的是slf4j-log4j12這個jar包。

  • 通過查閱log4j2官方資料可知,slf4j集成log4j2時需要的橋接包是log4j-slf4j-impl。開發(fā)環(huán)境中slf4j綁定是正確的,因此可以打印日志。而生產(chǎn)環(huán)境中slf4j綁定的jar包是slf4j-log4j12。所以生產(chǎn)環(huán)境輸出不了日志。產(chǎn)生這個問題的根本原因是lib里面有多個了slf4j可綁定的jar包。

三、解決方案

由于是slf4j綁定jar包錯誤而導致打印不了日志。所以我們必須要把這個slf4j-log4j12.jar包排除干凈。這個包主要來源有:

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

(2)zkclient

(3)zookeeper

排除完jar包后,本地進行打包。打包完成后,必須要檢查一遍,看一下生成的打包文件的lib文件夾下是否還存在slf4j-log4j12.jar。如果有,應該是jar包沒排除干凈??梢酝ㄟ^maven命令查看依賴樹,看看是那個依賴把這個jar給傳遞進來的。命令為:dependency:tree

四、小結

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

(2)當有多個SLF4j的橋接包時,一定要排除不需要的包

(2)項目啟動時控制臺輸出的信息很重要,耐心觀察啟動日志可以解決很多問題

轉(zhuǎn)載自:https://www.cnblogs.com/zeng1994/p/df2559e6dc66c99065676e0ee70545eb.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容