前言

在开发基于Spring Boot和MyBatis Plus的项目时,日志功能是调试和优化SQL查询的核心工具。通过合理配置日志输出,开发者可以直观查看生成的SQL语句、执行时间、参数值以及潜在的性能瓶颈。

一、MyBatis Plus日志配置

1.1 基础配置:直接输出SQL日志

1.1.1 配置log-impl

MyBatis Plus提供了一个简单的配置项log-impl,可将SQL日志直接输出到控制台。

配置方式(application.yml):

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

效果示例:

DEBUG [http-nio-8080-exec-1] c.b.mp.mapper.UserMapper.selectList - ==> Preparing: SELECT * FROM user WHERE age > ? 
DEBUG [http-nio-8080-exec-1] c.b.mp.mapper.UserMapper.selectList - ==> Parameters: 18(Integer)
DEBUG [http-nio-8080-exec-1] c.b.mp.mapper.UserMapper.selectList - <== Total: 5

说明:

  • ==> Preparing: 显示SQL语句(占位符形式)。
  • ==> Parameters: 显示参数值。
  • <== Total: 显示查询结果数量。
1.1.2 通过日志框架调整日志级别

若项目使用Logback或Log4j2等日志框架,可通过设置包路径的日志级别来控制输出。

配置方式(application.yml):

logging:level:com.example.mapper: DEBUG

效果:

  • 输出与log-impl类似的SQL日志,但需依赖日志框架的配置。

1.2 高级配置:自定义日志格式

1.2.1 使用自定义Log实现类

通过实现org.apache.ibatis.logging.Log接口,开发者可以自定义日志格式。

步骤:

  1. 创建自定义Log类:
public class CustomLogger implements Log {@Overridepublic boolean isDebugEnabled() { return true; }@Overridepublic void debug(String s) { System.out.println("[DEBUG] " + s); }// 其他方法实现...
}
  1. 配置log-impl
mybatis-plus:configuration:log-impl: com.example.CustomLogger

效果示例:

[DEBUG] [SQL_EXECUTE] SELECT id, name, age FROM user WHERE age > 18
[DEBUG] [RESULT] 5 rows affected

二、P6Spy日志配置:更详细的SQL监控

2.1 为什么使用P6Spy?

P6Spy是一个轻量级的数据库访问监控工具,支持以下功能:

  • 完整SQL输出:替换占位符?为实际参数值。
  • 慢SQL检测:记录执行时间超过阈值的SQL。
  • 多格式日志:支持控制台、文件、日志框架(如SLF4J)输出。

2.2 配置步骤

2.2.1 添加依赖

pom.xml中引入P6Spy依赖:

<dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version>
</dependency>
2.2.2 修改数据源配置

将JDBC驱动替换为P6Spy代理驱动,并调整URL格式。

application.yml配置示例:

spring:datasource:driver-class-name: com.p6spy.engine.spy.P6SpyDriverurl: jdbc:p6spy:mysql://localhost:3306/demousername: rootpassword: root
2.2.3 创建spy.properties文件

src/main/resources目录下创建spy.properties,配置P6Spy行为:

# 模块列表
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory# 自定义日志格式
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger# 日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger# 取消JDBC驱动注册
deregisterdrivers=true# 使用前缀
useprefix=true# 排除的日志类别
excludecategories=info,debug,result,commit,resultset# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss# 实际驱动列表
driverlist=com.mysql.cj.jdbc.Driver# 开启慢SQL记录
outagedetection=true# 慢SQL记录标准(单位:秒)
outagedetectioninterval=2# 过滤特定表的SQL
filter=true
exclude=flw_.+

关键配置说明:

  • excludecategories:排除冗余日志(如resultcommit)。
  • outagedetectioninterval:慢SQL阈值(单位:秒)。
  • exclude=flw_.+:正则表达式,过滤表名以flw_开头的SQL。
2.2.4 控制台输出示例
[2025-06-24 21:25:47] [main] [INFO] Execute SQL: SELECT id, name, age FROM user WHERE age > 18
[2025-06-24 21:25:47] [main] [INFO] Parameters: 18
[2025-06-24 21:25:47] [main] [INFO] Elapsed Time: 12ms
2.2.5 慢SQL监控输出

当SQL执行时间超过2秒时,P6Spy会标记为慢SQL:

[2025-06-24 21:25:47] [main] [WARN] Outage Detected: SQL execution took 3000ms
[2025-06-24 21:25:47] [main] [INFO] Slow SQL: SELECT * FROM large_table WHERE condition = 'value'

三、生产环境注意事项

3.1 性能影响

  • 控制台日志:频繁输出SQL日志会增加I/O开销,建议仅在开发环境启用。
  • 文件日志:若需记录日志,使用文件输出(如FileLogger)并定期归档。

3.2 安全性

  • 敏感数据:避免在日志中记录用户密码、信用卡号等敏感信息。
  • 日志过滤:通过exclude配置过滤业务无关的表(如流程引擎表flw_*)。

3.3 兼容性

  • 驱动版本:确保driverlist中指定的驱动与实际数据库版本一致。
  • P6Spy版本:推荐使用3.9.x及以上版本以获得最佳兼容性。

四、进阶优化:自定义日志格式

4.1 实现MessageFormattingStrategy接口

通过自定义日志格式化策略,开发者可以灵活控制日志输出内容。

示例代码:

public class CustomP6SpyLogger implements MessageFormattingStrategy {@Overridepublic String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql) {return String.format("[%.3fms] %s", elapsed / 1000.0, sql);}
}

配置spy.properties

logMessageFormat=com.example.CustomP6SpyLogger

效果示例:

[0.012ms] SELECT id, name, age FROM user WHERE age > 18

五、总结

通过合理配置MyBatis Plus和P6Spy,开发者可以高效监控SQL执行情况,快速定位性能瓶颈。以下是关键建议:

  1. 开发环境:启用log-impl或P6Spy的完整日志输出,便于调试。
  2. 生产环境:关闭SQL日志输出,仅保留异常日志或慢SQL监控。
  3. 日志过滤:通过正则表达式排除无关表(如flw_*),减少冗余信息。
  4. 性能优化:利用P6Spy的慢SQL检测功能,持续优化数据库操作。

掌握这些配置技巧后,开发者不仅能提升调试效率,还能在复杂业务场景中保障系统的稳定性与性能。


附录:常见问题解答

Q1: 为什么SQL日志中没有显示实际参数值?

A1: 确保使用P6Spy而非MyBatis Plus默认的StdOutImpl,P6Spy会自动替换占位符?为实际参数。

Q2: P6Spy配置后无法连接数据库?

A2: 检查driverlist是否包含实际数据库驱动(如com.mysql.cj.jdbc.Driver),并确认URL格式为jdbc:p6spy:mysql://...

Q3: 如何将日志输出到文件?

A3: 修改spy.properties中的appender配置:

appender=com.p6spy.engine.spy.appender.FileLogger
logfile=/path/to/p6spy.log

参考文献:

  • MyBatis Plus官方文档(https://www.baomidou.com/introduce/)
  • P6Spy GitHub仓库(https://github.com/p6spy/p6spy)
  • Spring Boot日志配置指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88313.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88313.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88313.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloudGateway(spel)漏洞复现 Spring + Swagger 接口泄露问题

环境配置 gateway Spring Cloud &#xff1a; 这个就是分布式的微服务组件 微服务 &#xff1a; 一般指的是独立的&#xff0c;专注于一项功能的服务 Gateway 这个其实是个云端的网关配置&#xff08;他的作用就是对访问web的流量进行防护比如一些爬虫的阻截&#xff0…

服务器手动安装并编译R环境库包:PROJ→RGDAL

目录 方式1&#xff1a;conda-forge安装错误&#xff1a;缺乏libnsl.so.1✅ 方法一&#xff1a;查找系统中是否已有此库替补方案&#xff1a;采用libnsl.so.3链接 libnsl.so.1✅ 方法二&#xff1a;系统中没有安装 libnsl.so.1 → 手动安装✅ 方法三&#xff1a;使用 Conda 安装…

教育技术学读计算机论文的提示词

角色: 你是一位经验丰富的计算机专业教授,擅长用通俗易懂的语言向初学者解释复杂概念。我现在正在学习阅读计算机科学领域的算法论文,但我的基础比较薄弱(了解编程基础如变量、循环、函数,了解一点数据结构和算法概念如数组、链表、排序,但对高级术语和数学证明不熟悉)。…

棋盘格标定板和圆形标定板的优劣性

来源&#xff1a;deepseek 在相机标定中&#xff0c;棋盘格标定板和圆形标定板&#xff08;或圆点阵列标定板&#xff09;是最常用的两种类型。它们各有优劣&#xff0c;选择哪种取决于具体的应用场景、需求以及使用的标定算法。以下是它们的主要优劣对比&#xff1a; &#…

2025年UDP洪水攻击防御指南:从7.3Tbps攻防战看原理与实战

45秒37.4TB流量&#xff01;一场刷新历史纪录的DDoS攻击正在颠覆传统防御体系 一、什么是UDP洪水攻击&#xff1f; UDP洪水攻击&#xff08;UDP Flood&#xff09;是一种利用用户数据报协议&#xff08;UDP&#xff09; 的无连接特性发起的分布式拒绝服务&#xff08;DDoS&…

一种集成统计、视觉和基于规则方法的新型可解释医学图像分类人工智能框架|文献速递-最新论文分享

Title 题目 A novel explainable AI framework for medical image classificationintegrating statistical, visual, and rule-based methods 一种集成统计、视觉和基于规则方法的新型可解释医学图像分类人工智能框架 01 文献速递介绍 人工智能&#xff08;AI&#xff09;…

洛谷 P10113 [GESP202312 八级] 大量的工作沟通-普及/提高-

题目描述 某公司有 N N N 名员工&#xff0c;编号从 0 0 0 至 N − 1 N-1 N−1。其中&#xff0c;除了 0 0 0 号员工是老板&#xff0c;其余每名员工都有一个直接领导。我们假设编号为 i i i 的员工的直接领导是 f i f_i fi​。 该公司有严格的管理制度&#xff0c;每位…

数组题解——移除元素​【LeetCode】

27. 移除元素 快慢指针法 算法思路 使用双指针&#xff08;fast和slow&#xff09;遍历数组。 fast指针遍历每一个元素。slow指针指向下一个将被保留的位置。 如果nums[fast] ! val&#xff0c;就把nums[fast]赋值到nums[slow]&#xff0c;并将slow向前移动一位。遍历结束后…

ubuntu20.04安装多版本python时,如何使用sudo python3.10

sudo 命令只会加载基本的path和动态库&#xff0c;自己定义的不会加入&#xff0c;因此会出现使用sudo运行多版本python出现奇怪的现象&#xff0c;进行如下操作就可以使用 sudo vi ~/.bashrc alias sudosudo env PATH$PATH LD_LIBRARY_PATH$LD_LIBRARY_PATH 使用 sudo visud…

统计学纯基础(1)

⛄统计分析分为统计描述与统计推断&#xff0c;统计推断分为总体估计与假设检验 &#x1f3c2;16&#xff1a;45 医学研究--基础研究、转化医学研究、临床研究 临床研究--病因学研究、诊断准确性试验、预后研究、疗效研究 一般认为3个月以内的预后属于近期预后&#xff0c;…

接口自动化测试之pytest 运行方式及前置后置封装

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、Pytest 优点认知 1.可以结合所有的自动化测试工具 2.跳过失败用例以及失败重跑 3.结合allure生产美观报告 4.和Jenkins持续集成 5.很多强大的插件 pytest-htm…

利用folium实现全国高校分布地图显示

智汇中国 | 揭秘!一张地图带你遨游全国高校殿堂 大家好,这期我们来利用folium模块实现全国高校分布的地图显示。 什么是Folium Folium为Python用户提供了便捷的方式来利用Leaflet.js的强大地图可视化功能,而无需直接编写JavaScript代码。它允许开发者以Pythonic的方式处理…

【和春笋一起学C++】(二十二)C++函数新特性——函数重载

目录 函数重载的含义 重载函数使用注意事项 几种特殊情况 函数重载的含义 函数重载使得能够用不同的参数列表调用多个同名的函数。可以通过函数重载设计一系列函数,它们完成相同的工作,但使用不同的参数列表。 函数重载的关键是函数的参数列表——也被称为函数特征标。如…

CrewAI多智能体框架的实操教程-旅行规划-2

1、创建一个新的 CrewAI 项目 surprise_trip crewai create crew surprise_trip 选择模型厂商和模型 生成.env MODELgpt-4o OPENAI_API_KEY你的api_keySERPER_API_KEY你的SERPER api_key 2、探索项目结构 3、配置代理 修改 agents.yaml文件。 # 个性化活动规划师 Agent p…

vue脚手架与前后端交互

前言 。Vue.js作为一种流行的前端框架&#xff0c;提供了丰富的功能和灵活的架构&#xff0c;方便了开发者进行高效的开发。为了更好地使用Vue&#xff0c;Vue CLI&#xff08;脚手架工具&#xff09;成为了开发者进行项目创建和管理的重要工具。本文将结合Vue脚手架的使用场景…

【麻省理工】《how to speaking》笔记

【【麻省理工】《如何说话》一节课教你成为表达的王者】 开始 在演讲最开始的时候&#xff0c;你要告诉观众&#xff0c;在接下来的15分钟或一个小时之内&#xff0c;他们将会学到什么东西。这会让观众集中注意力去倾听。 PPT 你的幻灯片上的字要越少越好。因为听众的大脑一…

ESP32-HTML-08

一、html显示图片 1.工程包含Html需要显示的图片 2、CMakeLists.txt包含图片资源 举例&#xff1a; idf_component_register(SRCS main.cEMBED_FILES root.html favicon.ico) 3.html中图片的标签 <img src"motus.ico"> 4.后台代码的添加 static esp_e…

前端后端文件下载防抖实现方案

在 Vue 3 中实现下载文件防抖&#xff0c;可以通过封装一个防抖函数来控制下载请求的触发频率。以下是完整的实现方案&#xff1a; 1. 封装防抖工具函数 javascript 复制 下载 // utils/debounce.js export function debounce(func, delay) {let timer null;return funct…

【Linux网络与网络编程】15.DNS与ICMP协议

1. DNS 1.1 DNS介绍 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是 IP 地址不方便记忆&#xff0c;于是人们发明了一种叫主机名的字符串&#xff0c;并使用 hosts 文件来描述主机名和 IP 地址的关系。最初, 通过互连网信息中心(SRI-NIC)来…

Python打卡:Day35

复习日 浙大疏锦行