MyBatis-Plus SQL日志配置全 - 控制台输出与日志文件记录指南
- 发布时间:2025-02-20 17:29:53
- 本文热度:浏览 27 赞 0 评论 0
- 文章标签: MyBatis-Plus 日志配置 SQL调试
- 全文共1字,阅读约需1分钟
一、基础配置原理剖析
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;
}
}
七、生产环境建议
- 敏感信息过滤
public class SensitiveParamFilter implements ParameterHandler {
@Override
public void setParameters(PreparedStatement ps) {
// 对敏感参数进行脱敏处理
}
}
- 日志文件分离配置(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>
八、性能优化建议
- 使用异步日志
<appender name="ASYNC_SQL" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>1024</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="SQL_FILE"/>
</appender>
- 采样日志配置
<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
<Key>sqlLog</Key>
<DefaultThreshold>ERROR</DefaultThreshold>
<MDCValueLevelPair>
<value>DEBUG</value>
<level>DEBUG</level>
</MDCValueLevelPair>
</turboFilter>
九、常见问题排查
- 日志不显示可能原因:
- 日志级别设置过高(应设为DEBUG)
- 多个日志框架冲突
- MyBatis-Plus版本兼容性问题
- 配置位置不正确
- 性能问题分析:
- 检查是否开启PreparedStatement缓存
- 确认连接池配置是否合理
- 检查SQL语句执行计划
十、测试验证方法
- 编写测试用例
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
User user = userMapper.selectById(1L);
assertNotNull(user);
}
}
- 观察控制台输出
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
正文到此结束
相关文章
热门推荐
评论插件初始化中...