MyBatis-Plus SQL日志配置全 - 控制台输出与日志文件记录指南

一、基础配置原理剖析

MyBatis-Plus的SQL日志输出本质上是通过MyBatis的日志模块实现的。核心接口org.apache.ibatis.logging.Log定义了日志输出的标准方法,MyBatis-Plus通过SLF4J、Log4j2等日志门面与具体实现框架进行桥接。

在Spring Boot项目中,默认的日志实现是SLF4J+Logback组合。要启用SQL日志输出,需要配置MyBatis-Plus的日志级别为DEBUG。这是因为SQL语句的执行属于DEBUG级别的日志信息。

二、YAML配置方式详解

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 或者使用SLF4J实现
  # log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

此配置直接指定MyBatis使用的日志实现类。StdOutImpl会将日志输出到控制台,Slf4jImpl则会通过SLF4J接口转发到配置的日志系统(如Logback)。

三、Properties配置方式

# 直接控制台输出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# 使用SLF4J
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

四、日志框架集成配置

1. Logback配置示例

<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>

2. Log4j2配置示例

<Loggers>
    <Logger name="com.baomidou.mybatisplus" level="debug" />
    <Logger name="java.sql.Connection" level="debug" />
    <Logger name="java.sql.Statement" level="debug" />
    <Logger name="java.sql.PreparedStatement" level="debug" />
</Loggers>

五、SQL日志格式解析

典型SQL日志输出示例:

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e9f23a4] 
JDBC Connection [HikariProxyConnection@1060699461 wrapping com.mysql.cj.jdbc.ConnectionImpl@7e0b0338] 
==>  Preparing: SELECT id,name,age FROM user WHERE id=? 
==> Parameters: 1(Integer)
<==    Columns: id, name, age
<==        Row: 1, Jack, 30
<==      Total: 1
Closing non transactional SqlSession

各字段含义:

  • Preparing: 预编译的SQL语句
  • Parameters: 绑定参数值
  • Columns: 返回结果集的列名
  • Row: 具体数据行
  • Total: 查询结果总数

六、高级配置技巧

1. 参数格式化

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 启用参数美化输出
    log-sql-pretty: true

2. 多数据源配置

@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource() {
    return DruidDataSourceBuilder.create().build();
}

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PerformanceInterceptor());
    return interceptor;
}

3. 动态日志级别控制

@RestController
public class LogController {
    
    @PostMapping("/change-sql-log-level")
    public String changeLogLevel(@RequestParam String level) {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        loggerContext.getLogger("com.baomidou.mybatisplus").setLevel(Level.valueOf(level));
        return "SQL日志级别已修改为:" + level;
    }
}

七、生产环境建议

  1. 敏感信息过滤
public class SensitiveParamFilter implements ParameterHandler {
    @Override
    public void setParameters(PreparedStatement ps) {
        // 对敏感参数进行脱敏处理
    }
}
  1. 日志文件分离配置(Logback示例)
<appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/sql.log</file>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>logs/sql.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
        <maxFileSize>50MB</maxFileSize>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

<logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false">
    <appender-ref ref="SQL_FILE"/>
</logger>

八、性能优化建议

  1. 使用异步日志
<appender name="ASYNC_SQL" class="ch.qos.logback.classic.AsyncAppender">
    <queueSize>1024</queueSize>
    <discardingThreshold>0</discardingThreshold>
    <appender-ref ref="SQL_FILE"/>
</appender>
  1. 采样日志配置
<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
    <Key>sqlLog</Key>
    <DefaultThreshold>ERROR</DefaultThreshold>
    <MDCValueLevelPair>
        <value>DEBUG</value>
        <level>DEBUG</level>
    </MDCValueLevelPair>
</turboFilter>

九、常见问题排查

  1. 日志不显示可能原因:
  • 日志级别设置过高(应设为DEBUG)
  • 多个日志框架冲突
  • MyBatis-Plus版本兼容性问题
  • 配置位置不正确
  1. 性能问题分析:
  • 检查是否开启PreparedStatement缓存
  • 确认连接池配置是否合理
  • 检查SQL语句执行计划

十、测试验证方法

  1. 编写测试用例
@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        User user = userMapper.selectById(1L);
        assertNotNull(user);
    }
}
  1. 观察控制台输出
DEBUG 12345 --- [           main] c.b.m.core.injector.DefaultSqlInjector   : SQL: SELECT id,name,age FROM user WHERE id=?
DEBUG 12345 --- [           main] c.b.m.c.e.m.UserMapper.selectById        : ==> Parameters: 1(Long)
DEBUG 12345 --- [           main] c.b.m.c.e.m.UserMapper.selectById        : <==      Total: 1
正文到此结束
评论插件初始化中...
Loading...