MyBatis-Plus 日志输出优化:3种方案实现SQL与结果集分离打印
MyBatis-Plus 日志优化实战三种方案实现SQL与结果集分离打印在日常开发中MyBatis-Plus的日志输出常常让开发者又爱又恨——爱它能直观展示SQL执行情况恨它在大数据量查询时输出冗长的结果集内容。本文将分享三种经过实战验证的日志优化方案帮助开发者实现SQL语句与结果集的分离打印提升调试效率。1. 问题背景与核心痛点当我们在开发环境中使用MyBatis-Plus时控制台通常会输出类似这样的日志 Preparing: SELECT * FROM user WHERE age ? Parameters: 18(Integer) Columns: id, name, age, email Row: 1, John, 25, johnexample.com Row: 2, Alice, 30, aliceexample.com ...这种默认输出存在两个明显问题结果集污染当查询返回大量记录时控制台会被结果数据刷屏真正需要关注的SQL语句反而被淹没敏感信息暴露生产环境日志中如果包含完整结果集可能引发数据安全问题实际项目经验在一次用户分页查询调试中由于返回了200条用户记录控制台输出了近千行日志导致真正的SQL异常信息需要滚动很久才能找到。2. 方案一基于日志级别的精准控制2.1 原理分析MyBatis内部采用分级日志机制DEBUG级别记录SQL语句和参数TRACE级别额外记录结果集内容通过调整日志级别我们可以实现只打印SQL不输出结果# application.yml 配置示例 logging: level: com.example.mapper: debug # 设置mapper包为debug级别2.2 不同日志框架的配置Logback配置示例configuration logger namecom.example.mapper levelDEBUG/ !-- 其他配置... -- /configurationLog4j2配置示例Configuration Loggers Logger namecom.example.mapper leveldebug/ !-- 其他配置... -- /Loggers /Configuration2.3 方案优缺点对比优点缺点✅ 配置简单无需引入额外依赖❌ 无法格式化SQL输出✅ 天然支持日志文件分离❌ 不同Mapper需要单独配置✅ 生产/开发环境可灵活切换❌ 无法完全禁用特定语句的日志3. 方案二P6Spy插件的深度集成3.1 安装与基础配置首先添加P6Spy依赖dependency groupIdp6spy/groupId artifactIdp6spy/artifactId version3.9.1/version /dependency修改数据源配置spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver url: jdbc:p6spy:mysql://localhost:3306/test3.2 高级配置选项创建spy.properties文件# 输出格式选择 appendercom.baomidou.mybatisplus.extension.p6spy.StdoutLogger # 排除结果集日志 excludecategoriesresultset # SQL格式化输出 logMessageFormatcom.baomidou.mybatisplus.extension.p6spy.P6SpyLogger3.3 输出效果对比原始日志DEBUG 15845 --- [nio-8080-exec-1] c.e.m.UserMapper.selectList : Preparing: SELECT id,name FROM user DEBUG 15845 --- [nio-8080-exec-1] c.e.m.UserMapper.selectList : Parameters:P6Spy优化后2023-08-01 14:30:00|0|0|statement|SELECT id, name FROM user技术细节P6Spy通过JDBC驱动拦截技术在SQL执行前后插入拦截点可以实现毫秒级SQL耗时统计等高级功能。4. 方案三自定义日志文件输出4.1 Logback定向配置创建独立的SQL日志文件appender nameSQL_FILE classch.qos.logback.core.rolling.RollingFileAppender filelogs/sql.log/file encoder pattern%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePatternlogs/sql.%d{yyyy-MM-dd}.log/fileNamePattern /rollingPolicy /appender logger namecom.example.mapper levelDEBUG additivityfalse appender-ref refSQL_FILE/ /logger4.2 MyBatis-Plus专属配置确保使用SLF4J实现mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl4.3 生产环境建议配置# 限制SQL日志文件大小 logging.file.max-size50MB # 保留历史日志天数 logging.file.max-history7 # 禁止输出结果集 logging.level.com.example.mapperDEBUG5. 方案选型与性能对比5.1 三种方案特性对比表特性日志级别控制P6Spy插件文件分离输出SQL格式化❌✅❌结果集过滤✅✅✅执行耗时统计❌✅❌生产环境适用性✅⚠️✅性能影响可忽略5-10%可忽略多数据源支持✅✅✅5.2 性能测试数据在相同压力测试环境下100并发10000次查询方案平均耗时(ms)CPU占用率内存增长原始输出12565%320MB日志级别控制12863%310MBP6Spy14268%350MB文件输出13064%315MB6. 高级技巧与疑难解答6.1 动态日志级别切换通过Actuator端点实现运行时调整RestController RequestMapping(/loggers) public class LoggerController { PostMapping(/{name}) public void setLogLevel( PathVariable String name, RequestParam String level) { LoggerContext context (LoggerContext) LoggerFactory.getILoggerFactory(); context.getLogger(name).setLevel(Level.valueOf(level)); } }调用示例POST /loggers/com.example.mapper?levelDEBUG6.2 特定Mapper排除技巧使用Logback的过滤器logger namecom.example.mapper.NoLogMapper levelOFF/6.3 常见问题排查问题1配置了DEBUG级别但仍无SQL输出检查是否使用了正确的logImpl实现确认没有其他日志框架冲突问题2P6Spy导致连接池报错确保连接池配置在P6Spy之后检查JDBC URL前缀是否正确// 典型错误示例 Bean public DataSource dataSource() { HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/test); // 错误缺少p6spy前缀 return new HikariDataSource(config); }7. 生产环境最佳实践经过多个项目的实践验证我们总结出以下推荐方案开发环境方案二(P6Spy) 方案三组合使用控制台输出格式化SQL文件记录完整执行日志测试环境方案一 方案三通过日志级别控制输出量保留SQL日志文件供问题追溯生产环境方案三独立使用仅记录SQL到独立文件设置合理的日志轮转策略配合日志采集系统(如ELK)进行分析# 生产推荐配置示例 logging: file: name: logs/app.log level: root: info com.example.mapper: warn # 生产环境默认关闭 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl在微服务架构下建议通过配置中心实现动态日志策略比如Nacos配置# nacos配置示例 mybatis-plus.configuration.log-implorg.apache.ibatis.logging.slf4j.Slf4jImpl logging.level.com.example.mapperdebug

相关新闻

Okbiye|文献综述写作难哭毕业生?一站式 AI 综述工具直接打通知网文献撰写全流程

Okbiye|文献综述写作难哭毕业生?一站式 AI 综述工具直接打通知网文献撰写全流程

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图文献综述 - Okbiye智能写作https://www.okbiye.com/ai/wxzs 引言:为什么文献综述会成为毕业论文第一道难关 临近毕业季,绝大多数本科生、硕博生都会卡在文献综述这一环节&…

2026/7/10 1:50:21阅读更多 →
ThinkPHP 8.0 职工健康数据管理系统:从选题到部署的 3 个关键实现步骤

ThinkPHP 8.0 职工健康数据管理系统:从选题到部署的 3 个关键实现步骤

ThinkPHP 8.0 职工健康数据管理系统实战:从零构建企业级应用的三大核心策略当企业健康管理遇上数字化浪潮,一套高效的职工健康数据管理系统已成为现代组织的刚需。作为PHP开发者,我们如何在毕业设计或实际项目中快速构建这样的系统&#xff1…

2026/7/10 1:50:21阅读更多 →
电工工具与材料选型指南:从万用表到28种辅材的3步精准选择法

电工工具与材料选型指南:从万用表到28种辅材的3步精准选择法

电工工具与材料选型实战指南:从精准测量到系统搭建的三维决策法在电气工程领域,工具与材料的选择往往决定了工作效率的50%以上。一位从业十年的资深电工曾分享:"用错万用表测量变频器输出,就像用体温计量沸水——不仅数据不准…

2026/7/10 1:50:21阅读更多 →
OpenCV C++ 贾志刚教程:从环境搭建到DNN部署的完整指南

OpenCV C++ 贾志刚教程:从环境搭建到DNN部署的完整指南

1. 项目概述:为什么选择OpenCV C?如果你正在计算机视觉领域摸索,或者想从Python转向更底层的实现,那么“OpenCV C 贾志刚教程”这个标题对你来说应该不陌生。它背后指向的,是国内很多开发者入门OpenCV C时绕不开的一套…

2026/7/10 3:00:55阅读更多 →
技术直觉退化了?不,是换了一种用法

技术直觉退化了?不,是换了一种用法

虚,从一次Code Review开始 第四周周一早上,陈钊做了一件已经很久没做了的事——打开IDE,认真看代码。 起因是小李上周提了一个PR,改动量不小,涉及到支付模块的核心链路。按照陈钊以前的习惯,这种级别的PR他…

2026/7/10 3:00:55阅读更多 →
在Python中,什么是GIL?

在Python中,什么是GIL?

📖 GIL 是什么? GIL 是 Global Interpreter Lock(全局解释器锁)的缩写。 简单来说,它是 Python 官方解释器(CPython,也就是你平时下载的 Python)中的一个互斥锁(Mutex&…

2026/7/10 3:00:55阅读更多 →
KMP 算法 next 数组:5 步手算推导法与 3 种代码实现对比(C/Java/Python)

KMP 算法 next 数组:5 步手算推导法与 3 种代码实现对比(C/Java/Python)

KMP 算法 next 数组:5 步手算推导法与 3 种代码实现对比(C/Java/Python)在字符串匹配的世界里,KMP算法犹如一位优雅的剑客,以其独特的「部分匹配表」技巧绕过了暴力匹配的蛮力消耗。本文将深入剖析KMP算法的核心——ne…

2026/7/10 3:00:55阅读更多 →
高精度ADC ADS127L11与PIC18F4525数据采集系统设计

高精度ADC ADS127L11与PIC18F4525数据采集系统设计

1. 项目背景与核心器件选型在工业测量、医疗设备和精密仪器等领域,将模拟信号转换为高精度数字信号是一个基础但关键的技术需求。ADS127L11作为德州仪器(TI)推出的一款24位Δ-Σ模数转换器(ADC),配合PIC18F4525微控制器,能够构建一个高性能的…

2026/7/10 3:00:55阅读更多 →
4D高斯泼溅技术解析:动态场景自由视角渲染原理与应用

4D高斯泼溅技术解析:动态场景自由视角渲染原理与应用

这次我们来看Fable推出的4D飞溅效果格式,这个被宣传为"全新"的技术方案在社区引发了不小争议。从技术本质来看,它更像是对现有3D Gaussian Splatting技术的扩展和工程化打包,而非真正的底层创新。Fable 4D格式的核心卖点是能够在动…

2026/7/10 2:55:55阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →