首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 控制台 SQL 日誌輸出配置指南:Log4j/Log4j2/SLF4J

     編輯:Java 相關知識

核心原理

MyBatis 內置日誌工廠自動檢測類路徑中的日誌框架(優先級:SLF4J → Log4j2 → Log4j → JDK Logging → No Logging)。啟用 SQL 日誌需:

  1. 項目引入日誌實現 (Log4j/Log4j2/Logback + SLF4J)
  2. 配置 MyBatis 相關 Logger 級別為 DEBUG 或 TRACE

Log4j 1.x 配置 (log4j.properties)

### 根日誌級別
log4j.rootLogger=INFO, stdout, file

### 控制台輸出
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{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c{1}:%L - %m%n

### 文件輸出 (滾動)
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/mybatis.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c{1}:%L - %m%n

### 【關鍵】MyBatis SQL 日誌啟用
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

### 可選:僅啟用特定 Mapper 的 SQL 日誌
# log4j.logger.com.example.mapper.UserMapper=TRACE

Log4j 2.x 配置 (log4j2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n"/>
        </Console>
        <RollingFile name="File" fileName="logs/mybatis.log" filePattern="logs/mybatis-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
    </Appenders>
    
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Root>
        
        <!-- 【關鍵】MyBatis SQL 日誌 -->
        <Logger name="org.apache.ibatis" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Logger>
        <Logger name="java.sql.Connection" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Logger>
        <Logger name="java.sql.Statement" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Logger>
        <Logger name="java.sql.PreparedStatement" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Logger>
        <Logger name="java.sql.ResultSet" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Logger>
        
        <!-- 可選:特定 Mapper -->
        <!-- <Logger name="com.example.mapper" level="TRACE" additivity="false">...</Logger> -->
    </Loggers>
</Configuration>

Logback 配置 (logback-spring.xml / logback.xml)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L - %msg%n"/>
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder><pattern>${LOG_PATTERN}</pattern></encoder>
    </appender>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/mybatis.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/mybatis-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder><pattern>${LOG_PATTERN}</pattern></encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
    
    <!-- 【關鍵】MyBatis SQL 日誌 -->
    <logger name="org.apache.ibatis" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
    <logger name="java.sql.Connection" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
    <logger name="java.sql.Statement" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
    <logger name="java.sql.PreparedStatement" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
    <logger name="java.sql.ResultSet" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
</configuration>

Spring Boot 專用配置 (application.yml)

logging:
  level:
    # MyBatis SQL 日誌
    org.apache.ibatis: DEBUG
    java.sql.Connection: DEBUG
    java.sql.Statement: DEBUG
    java.sql.PreparedStatement: DEBUG
    java.sql.ResultSet: DEBUG
    # 特定 Mapper (可選)
    # com.example.mapper: TRACE
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L - %msg%n"
  file:
    name: logs/application.log
  logback:
    rollingpolicy:
      max-file-size: 10MB
      max-history: 30

MyBatis 內置配置 (mybatis-config.xml)

<settings>
    <setting name="logImpl" value="SLF4J"/> <!-- 指定日誌實現:SLF4J/LOG4J/LOG4J2/JDK_LOGGING/STDOUT_LOGGING/NO_LOGGING -->
    <setting name="logPrefix" value=""/> <-- 日誌前綴 -->
</settings>

日誌級別差異與選擇

級別輸出內容性能影響建議環境
ERROR錯誤堆棧極低生產
WARN警告信息極低生產
INFO啟動信息、緩存命中低生產
DEBUGSQL 語句、參數、結果集行數中開發/測試
TRACEDEBUG + 參數值詳細綁定、結果集數據高問題排查

生產環境嚴禁開啟 DEBUG/TRACE,會產生海量日誌、暴露敏感數據、嚴重影響性能。

參數值完整顯示技巧

DEBUG 級別下,PreparedStatement 參數以 ? 佔位。需完整看到實際 SQL:

  1. P6Spy:JDBC 代理驅動,自動格式化輸出實際 SQL(推薦生產排查)
  2. druid.stat.enable=true:Druid 連接池內置 SQL 統計與慢查詢捕獲
  3. 自定義 Log4j2 Layout:解析 MyBatis 日誌重組完整 SQL

P6Spy 快速接入 (Spring Boot)

<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
    <version>1.9.0</version>
</dependency>

# application.yml
decorator:
  datasource:
    p6spy:
      enable-logging: true
      multiline: true
      logging: slf4j

輸出示例:

SELECT * FROM t_user WHERE id = 1 AND name = '張三' -- 完整實際 SQL,無佔位符

常見問題排查

現象原因解決
無 SQL 日誌輸出Logger 級別未設為 DEBUG、日誌框架未正確初始化檢查配置文件路徑、logImpl 設置、依賴衝突
日誌雙重輸出additivity="false" 未設置、Root Logger 也輸出Logger 設置 additivity="false"
參數顯示為 ?DEBUG 級別默認行為用 TRACE 級別或 P6Spy/Druid
生產環境性能下降開啟了 DEBUG/TRACE生產僅 INFO/WARN,排查用 P6Spy 采樣
類加載器衝突多日誌框架共存 (Log4j + Logback)排除傳遞依賴,統一 SLF4J + 一個實現

總結

MyBatis SQL 日誌輸出核心:引入日誌實現 + 配置 org.apache.ibatis/java.sql.* Logger 為 DEBUG。主流框架 Log4j/Log4j2/Logback/Spring Boot 均支持。生產環境嚴禁開啟 DEBUG,排查慢 SQL/參數問題請用 P6Spy 或 Druid 監控。配置模板可直接複製適配項目,建議統一使用 SLF4J + Logback/Log4j2 作為日誌門面與實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved