Contents

log4j 關掉不想要看的 log

有時候 Spring 框架會輸出大量的 DEBUG 日誌,影響開發時的閱讀效率。透過 log4j 設定,可以針對特定 package 調整日誌層級,只顯示真正重要的訊息。

log4j 日誌層級

log4j 的日誌層級由低到高為:

1
TRACE → DEBUG → INFO → WARN → ERROR → FATAL

設定某個層級後,只有該層級及以上的日誌才會輸出。例如設定 ERROR,則只顯示 ERROR 和 FATAL 訊息。


關閉特定 Spring 日誌

問題:DefaultListableBeanFactory 輸出大量 DEBUG 訊息

Spring 啟動時,DefaultListableBeanFactory 會輸出每個 Bean 的載入資訊,訊息量很大:

1
2
3
DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'userService'
DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'orderRepository'
...

log4j.properties 設定

1
2
3
4
5
6
7
8
# 將 DefaultListableBeanFactory 的日誌設定為 ERROR 層級(只顯示錯誤)
log4j.logger.org.springframework.beans.factory.support.DefaultListableBeanFactory=ERROR

# 關閉 Hibernate SQL 參數日誌
log4j.logger.org.hibernate.type=ERROR

# 關閉 Spring MVC 的 request mapping 日誌
log4j.logger.org.springframework.web.servlet.mvc.method.annotation=WARN

常見需要關閉的 Spring / Hibernate 詳細日誌

log4j.properties 格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 關閉 Spring 框架的一般 DEBUG 訊息
log4j.logger.org.springframework=WARN

# 但保留事務相關的詳細日誌
log4j.logger.org.springframework.transaction=DEBUG

# 關閉 Hibernate SQL 語句日誌(若不想看到 SQL)
log4j.logger.org.hibernate.SQL=ERROR

# 關閉 Hibernate 綁定參數日誌
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=ERROR

# 關閉 MyBatis 的詳細日誌
log4j.logger.org.apache.ibatis=WARN
log4j.logger.java.sql=WARN

log4j2.xml 格式(log4j 2.x)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<Configuration status="WARN">
    <Loggers>
        <!-- 根日誌層級 -->
        <Root level="INFO">
            <AppenderRef ref="Console"/>
        </Root>

        <!-- 關閉 DefaultListableBeanFactory 的詳細日誌 -->
        <Logger name="org.springframework.beans.factory.support.DefaultListableBeanFactory"
                level="ERROR" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <!-- 關閉 Hibernate 詳細日誌 -->
        <Logger name="org.hibernate" level="WARN" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <!-- 保留自己應用程式的詳細日誌 -->
        <Logger name="com.example.myapp" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>

針對不同環境的策略

建議根據環境調整日誌設定:

1
2
3
4
5
6
7
8
# 開發環境:自己的程式碼用 DEBUG,框架用 WARN
log4j.logger.com.example=DEBUG
log4j.logger.org.springframework=WARN
log4j.logger.org.hibernate=WARN

# 生產環境:全部用 ERROR 或 WARN
log4j.rootLogger=WARN, appender
log4j.logger.com.example=INFO

日誌層級選擇建議

場景 建議層級
自己寫的業務邏輯 DEBUG(開發)/ INFO(生產)
Spring 框架本身 WARN
Hibernate / MyBatis WARN(除非要除錯 SQL)
第三方函式庫 ERROR
已知的無害警告 ERROR(直接關閉)