Hibernate 內部採用 Apache Commons Logging 抽象層,預設綁定 Log4j 實現。配置 log4j.properties 不僅能控制輸出格式、級別、目的地,更是開發階段「看見 SQL」與「排查異常」的核心工具。
### 輸出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 輸出到文件(按需啟用) ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 根級別:warn 級別輸出到 stdout ###
log4j.rootLogger=warn, stdout
### Hibernate 核心日誌級別 ###
#log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug
### 專項調試開關(按需取消註釋) ###
# HQL 解析器活動
#log4j.logger.org.hibernate.hql.ast.AST=debug
# 僅輸出 SQL
#log4j.logger.org.hibernate.SQL=debug
# JDBC 參數綁定詳情(極其有用)
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug
# Schema 生成/更新
log4j.logger.org.hibernate.tool.hbm2ddl=debug
# HQL 解析樹
#log4j.logger.org.hibernate.hql=debug
# 二級緩存活動
#log4j.logger.org.hibernate.cache=debug
# 事務活動
#log4j.logger.org.hibernate.transaction=debug
# JDBC 連接獲取
#log4j.logger.org.hibernate.jdbc=debug
# 連接洩漏追蹤
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
| 配置 | 典型輸出內容 | 適用場景 |
|---|---|---|
org.hibernate=error |
僅 SQL 語句 + 錯誤堆棧 | 生產環境、關注慢查詢 |
org.hibernate=debug |
完整啟動過程、SQL、參數綁定、緩存、事務、連接池等海量細節 | 開發調試、疑難雜症排查 |
org.hibernate.type=debug |
顯示 PreparedStatement 實際綁定的參數值(如 binding parameter [1] -> [chenyan]) |
SQL 參數驗證、數據類型不匹配排查 |
設置 debug 級別後,控制台將輸出數百行日誌,關鍵節點如下:
hibernate.cfg.xml、映射文件、解析 DTDselect hibernate_sequence.nextval from dual(Oracle 序列取值) → INSERT ... values (?, ?, ...)org.hibernate.type=debug,可見每個 ? 對應的實際值org.hibernate=debug + org.hibernate.type=info,既能看 SQL 又能見參數,不至于刷屏org.hibernate.SQL=debug 專門做 SQL 審計org.hibernate=error 或 warn,僅保留異常與慢查詢告警org.hibernate.cache=debug 觀察二級緩存命中率Log4j 配置沒有銀彈,「多輸出利於診斷,少輸出利於性能」。建議在專案中維護多套配置文件(如 log4j-dev.properties、log4j-prod.properties),通過構建工具或啟動參數動態切換,做到心中有數、按需開啟。