springboot項目大量打印debug日志問題


目前,java下應用最廣泛的日志系統主要就是兩個系列: log4j和slf4j+logback 。

其中,slf4j只包含日志的接口,logback只包括日志的具體實現,兩者加起來才是一個完整的日志系統。Log4j則同時包含了日志接口和實現。

這兩套日志系統之間有可以相互兼容的組件,分別是slf4j-log4j12和 log4j-over-slf4j,引入之后就可以用log4j打出slf4j接口的日志,或者用logback打出log4j接口的日志。

背景知識介紹到這里,再簡單說一下標題里提到的問題。問題的現象就是我們在war包里配置了log4j的日志級別為info, 但在catalina里卻一直在打大量的debug日志。初看現象肯定很詭異,前期各種研究tomcat配置也沒什么頭緒。直到磁盤壓力太大,去看jstack發現大量進程是等待在Logback代碼中,才發現之前關注錯了重點。再去具體了解了java下的日志系統后,問題也就很明了了。

先把幾個事實擺出來:
1. 打出的debug日志都是用slf4j寫的,根據堆棧得知logback具體執行了日志打印
2. logback在無配置文件時默認debug級別
3. 我們的war包中同時包含logback,log4j和slf4j-log4j12
4. Slf4j無法主動選擇具體的日志實現
想必看到這里,大家也明白了問題所在。根據我們引入的包,log4j和logback都可以實現打印slf4j日志,而具體誰來打,不是一個用正常辦法可以控制的事情,在這個具體案例下,logback就成了具體的日志打印者。而因為我們其實是想用lo4j打日志,所以沒有配logback配置,所以logback就按默認的debug級別打了大量日志。

解決辦法也很簡單,就是把logback的包全去掉。看似有些暴力,但確實是最合理的一個解決辦法。

查看依賴,發現spring-boot-starter-web包含了logback依賴包,將其移除即可。

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>logback-classic</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>logback-core</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.29</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.26</version>
            <exclusions>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

 

最后提供一個排查日志問題的通用套路,免得找不到方向亂看。
1. 找幾行不符合自己日志配置的具體日志,翻閱對應代碼,看看是哪個日志接口打的
2. 查jar包,看看這套日志框架有哪些具體實現
3. 把多的jar包去掉

 

參考博文:http://lichuanyang.top/posts/4433/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM