有時候 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(直接關閉) |