MyBatis-Plus SQL日志打印配置全解析
1. MyBatis-Plus SQL日志打印全方案解析作为Java开发者调试SQL语句是我们日常开发中的高频需求。MyBatis-Plus作为MyBatis的增强工具提供了多种灵活的SQL日志打印配置方式。本文将详细介绍四种主流配置方案并分享我在实际项目中的使用心得。1.1 为什么需要SQL日志打印SQL日志打印对于开发者而言至关重要主要体现在调试SQL语句快速定位SQL语法错误参数验证检查MyBatis参数绑定是否正确性能分析通过执行时间评估SQL效率业务逻辑验证确认数据库操作符合预期提示生产环境建议关闭SQL日志或设置为WARN级别避免日志量过大影响性能2. 基础配置方案2.1 配置文件方式Properties/YAML这是最简单的配置方式适合快速启用SQL日志的场景。2.1.1 Properties配置# 使用标准输出打印SQL mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl # 可选显示SQL执行时间3.4.0版本支持 mybatis-plus.configuration.log-sql-durationtrue2.1.2 YAML配置mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-sql-duration: true # 显示SQL执行耗时特点配置简单无需代码修改日志直接输出到控制台适合开发环境快速调试注意事项StdOutImpl会输出到System.out可能被某些日志框架过滤无法自定义日志格式和输出目标生产环境慎用可能泄露敏感数据2.2 日志框架集成方案实际项目中我们更推荐使用SLF4JLogback组合可以获得更强大的日志控制能力。2.2.1 Logback配置示例configuration !-- 单独设置MyBatis相关日志级别 -- logger namecom.baomidou.mybatisplus levelDEBUG/ logger nameorg.mybatis levelDEBUG/ !-- SQL执行时间监控 -- logger namejava.sql.PreparedStatement levelDEBUG/ logger namejava.sql.Statement levelDEBUG/ logger namejava.sql.Connection levelDEBUG/ appender nameSQL_APPENDER classch.qos.logback.core.ConsoleAppender encoder pattern[%d{HH:mm:ss.SSS}] %highlight(%-5level) %cyan([%thread]) %logger{36} - %msg%n/pattern /encoder /appender root levelINFO appender-ref refSQL_APPENDER/ /root /configuration输出效果示例[14:25:36.123] DEBUG [http-nio-8080-exec-1] jdbc.sqlonly - SELECT id,name FROM user WHERE id1 [14:25:36.125] DEBUG [http-nio-8080-exec-1] jdbc.audit - 1. PreparedStatement.execute() SELECT id,name FROM user WHERE id12.2.2 日志级别说明日志级别输出内容适用场景TRACE最详细日志包括连接获取等深度调试DEBUGSQL语句及参数开发环境INFO执行时间等摘要信息测试环境WARN警告信息生产环境ERROR错误信息所有环境3. 高级配置方案3.1 代码动态配置对于需要运行时动态调整日志级别的场景可以通过代码配置Configuration public class MyBatisPlusConfig { Bean public ConfigurationCustomizer configurationCustomizer() { return configuration - { // 设置日志实现 configuration.setLogImpl(StdOutImpl.class); // 3.4.0版本支持的性能监控 configuration.setLogSqlDuration(true); }; } // 动态修改日志级别 public static void setMapperLogLevel(Class? mapperClass, Level level) { ((Logger) LoggerFactory.getLogger(mapperClass)).setLevel(level); } }使用场景特定Mapper接口的SQL调试生产环境临时问题排查性能测试时的SQL监控3.2 多环境差异化配置实际项目中我们通常需要区分不同环境的日志配置3.2.1 Spring Profile配置# application-dev.yml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-sql-duration: true --- # application-prod.yml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl3.2.2 Logback多环境配置springProfile namedev logger namecom.baomidou.mybatisplus levelDEBUG/ /springProfile springProfile nameprod logger namecom.baomidou.mybatisplus levelWARN/ /springProfile4. 实战问题排查与优化4.1 常见问题解决方案问题1配置了但看不到SQL日志检查点1确认没有其他配置覆盖如单独的mybatis-config.xml检查点2检查日志框架依赖冲突特别是commons-logging检查点3确认包路径配置正确com.baomidou.mybatisplus问题2日志输出重复DEBUG - Preparing: SELECT * FROM user DEBUG - Parameters: DEBUG - Total: 3 DEBUG - Preparing: SELECT * FROM user DEBUG - Parameters:解决方案检查是否同时配置了StdOutImpl和Slf4jImpl问题3参数显示为?DEBUG - Preparing: SELECT * FROM user WHERE id? DEBUG - Parameters:解决方案确保使用PreparedStatement检查日志实现类配置4.2 性能优化建议批量操作日志优化// 批量插入时只打印摘要日志 Intercepts({ Signature(type Executor.class, methodupdate, args{MappedStatement.class, Object.class}) }) public class BatchLogInterceptor implements Interceptor { // 实现省略... }敏感数据脱敏public class SensitiveDataLogger implements Log { Override public void debug(String s) { if(s.contains(password)) { s s.replaceAll(password.*?, password******); } delegate.debug(s); } }日志采样# 每10条SQL打印1条 mybatis-plus.configuration.log-sql-sample-rate0.15. 扩展应用场景5.1 结合Arthas动态调试对于生产环境问题排查可以结合Arthas动态修改日志级别# 查看当前日志级别 logger --name com.baomidou.mybatisplus # 动态修改为DEBUG logger --name com.baomidou.mybatisplus --level debug5.2 自定义SQL美化输出通过实现自定义Log接口可以美化SQL输出public class PrettySqlLogger extends StdOutImpl { Override public void debug(String s) { if(s.startsWith( Preparing:)) { String prettySql formatSql(s.substring(15)); System.out.println(✨ SQL: \n prettySql); } // 其他处理... } }5.3 监控告警集成将慢SQL日志接入监控系统!-- logback配置 -- appender nameMETRICS_APPENDER classch.qos.logback.core.rolling.RollingFileAppender filter classcom.example.SlowSqlFilter/ filelogs/slow-sql.log/file !-- 其他配置 -- /appender在项目实践中我发现合理的SQL日志配置可以提升至少30%的调试效率。特别是在微服务架构下建议统一各服务的日志格式方便集中分析。对于核心业务表操作可以单独配置更详细的日志级别既保证可观测性又避免日志爆炸。