当前位置: 首页 > article >正文

Spring Boot项目SQL执行监控实战:手把手集成P6spy,自定义日志格式并输出到文件

Spring Boot生产环境SQL监控全方案P6spy高阶配置与日志持久化实战当你负责的电商系统在促销活动期间突然出现响应迟缓或是金融交易系统在月末结算时频繁超时数据库查询性能往往是首要怀疑对象。但生产环境的数据库通常不允许直接连接进行实时性能分析这时候一个设计良好的SQL监控方案就显得尤为重要。不同于开发阶段在控制台简单查看SQL语句生产环境需要更专业的监控手段完整的SQL执行记录、精确到毫秒的执行时间统计、与现有日志系统的无缝集成以及最重要的——所有监控数据必须持久化到文件供后续分析。这正是P6spy结合Spring Boot日志系统能够提供的专业级解决方案。1. 生产级P6spy集成方案1.1 依赖配置的工程化考量在正式环境集成P6spy时我们需要考虑更多生产级因素。基础的starter依赖虽然简单但缺乏灵活性。推荐使用以下组合依赖配置dependency groupIdcom.github.gavlyukovskiy/groupId artifactIdp6spy-spring-boot-starter/artifactId version1.9.0/version exclusions exclusion groupIdch.qos.logback/groupId artifactIdlogback-classic/artifactId /exclusion /exclusions /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency提示排除logback-classic可避免与现有日志系统的冲突特别当你使用Log4j2或其他日志框架时1.2 多环境配置策略生产环境与开发环境的配置应当隔离。建议采用Spring Profile机制实现差异化配置# application-prod.yml spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver url: jdbc:p6spy:mysql://prod-db.cluster-xxx.rds.amazonaws.com:3306/core_db hikari: connection-timeout: 30000 maximum-pool-size: 20# application-dev.yml spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver url: jdbc:p6spy:mysql://localhost:3306/dev_db?useSSLfalse2. 高级日志格式定制2.1 执行上下文增强基础的SQL日志往往缺乏执行上下文信息。我们可以扩展P6SpyLogger来包含更多元数据public class EnhancedP6SpyLogger implements MessageFormattingStrategy { private final ThreadLocalSimpleDateFormat dateFormat ThreadLocal.withInitial(() - new SimpleDateFormat(yyyy-MM-dd HH:mm:ss.SSS)); Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { if (StringUtils.isBlank(sql)) return ; StringBuilder sb new StringBuilder(\n); sb.append( SQL EXECUTION REPORT \n); sb.append(Timestamp: ).append(dateFormat.get().format(new Date())).append(\n); sb.append(Execution Time: ).append(elapsed).append(ms\n); sb.append(Connection ID: ).append(connectionId).append(\n); sb.append(Database: ).append(extractDbName(url)).append(\n); sb.append(Transaction Isolation: ).append(getCurrentTransactionIsolation()).append(\n); sb.append(SQL:\n).append(formatSql(sql)).append(\n); sb.append(); return sb.toString(); } private String formatSql(String sql) { return SqlFormatter.format(sql.replaceAll([\\s], )); } }2.2 慢查询预警机制P6spy内置慢查询检测功能但需要适当配置才能发挥最大效用# spy.properties outagedetectiontrue outagedetectioninterval2 appendercom.example.logging.Slf4jSlowQueryLogger配套的慢查询专用日志记录器实现public class Slf4jSlowQueryLogger extends Slf4JLogger { private static final Logger slowQueryLog LoggerFactory.getLogger(SLOW_QUERY); Override public void logSQL(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { if (elapsed 2000) { // 2秒阈值 String msg String.format([Slow Query] %dms - %s, elapsed, sql); slowQueryLog.warn(msg); } } }3. 日志持久化实战方案3.1 与Logback的高级集成生产环境需要将SQL日志独立存储并合理轮转。以下logback配置示例实现了将常规SQL日志与慢查询日志分离按天归档并压缩历史日志限制单个日志文件大小configuration appender nameSQL_FILE classch.qos.logback.core.rolling.RollingFileAppender filelogs/sql-execution.log/file rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy fileNamePatternlogs/archived/sql-execution-%d{yyyy-MM-dd}.%i.log.gz/fileNamePattern maxFileSize100MB/maxFileSize maxHistory30/maxHistory totalSizeCap5GB/totalSizeCap /rollingPolicy encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender appender nameSLOW_SQL_FILE classch.qos.logback.core.rolling.RollingFileAppender filelogs/slow-sql.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePatternlogs/archived/slow-sql-%d{yyyy-MM-dd}.log.gz/fileNamePattern maxHistory90/maxHistory /rollingPolicy encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} | %msg%n/pattern /encoder /appender logger namep6spy levelINFO additivityfalse appender-ref refSQL_FILE/ /logger logger nameSLOW_QUERY levelWARN additivityfalse appender-ref refSLOW_SQL_FILE/ /logger /configuration3.2 日志分析友好格式为便于后续使用ELK等工具分析可以考虑输出JSON格式日志public class JsonFormatLogger implements MessageFormattingStrategy { private final ObjectMapper mapper new ObjectMapper() .setDateFormat(new SimpleDateFormat(yyyy-MM-ddTHH:mm:ss.SSSZ)); Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { MapString, Object logEntry new LinkedHashMap(); logEntry.put(timestamp, new Date()); logEntry.put(executionTimeMs, elapsed); logEntry.put(connectionId, connectionId); logEntry.put(database, extractDbName(url)); logEntry.put(sql, sql); logEntry.put(prepared, prepared); logEntry.put(category, category); try { return mapper.writeValueAsString(logEntry); } catch (JsonProcessingException e) { return {\error\:\Failed to format SQL log\}; } } }对应的logback配置调整encoder classnet.logstash.logback.encoder.LogstashEncoder fieldNames timestamptimestamp/timestamp messagemessage/message /fieldNames /encoder4. 生产环境安全实践4.1 敏感信息过滤生产环境的SQL日志必须过滤敏感信息。我们可以通过正则表达式实现public class SecureP6SpyLogger extends P6SpyLogger { private static final ListPattern SENSITIVE_PATTERNS Arrays.asList( Pattern.compile((password|passwd|pwd)[\]?([^\\s,])[\]?, Pattern.CASE_INSENSITIVE), Pattern.compile((credit_card|cc_number)[\]?(\\d{4}[ -]?\\d{4}[ -]?\\d{4}[ -]?\\d{4})[\]?, Pattern.CASE_INSENSITIVE) ); Override public String formatMessage(/* 参数 */) { String filteredSql sql; for (Pattern pattern : SENSITIVE_PATTERNS) { filteredSql pattern.matcher(filteredSql).replaceAll($1******); } return super.formatMessage(connectionId, now, elapsed, category, prepared, filteredSql, url); } }4.2 动态启用机制通过外部配置动态控制P6spy的启用状态避免需要重启应用Configuration ConditionalOnProperty(name p6spy.enabled, havingValue true) public class P6spyConfiguration { Bean ConfigurationProperties(prefix spring.datasource) public DataSource dataSource(DataSourceProperties properties) { return properties.initializeDataSourceBuilder() .type(P6DataSource.class) .build(); } Bean public P6spyProperties p6spyProperties() { return new P6spyProperties(); } }对应的应用配置p6spy: enabled: true log-level: INFO slow-query-threshold: 10004.3 性能优化配置P6spy在生产环境使用时需要注意以下性能相关配置# spy.properties # 批量操作时不记录每一条SQL excludecategoriesbatch # 不记录结果集 excludecategoriesresultset # 设置刷新间隔毫秒 flushInterval1000 # 使用异步日志记录 appendercom.p6spy.engine.spy.appender.AsyncLogger在最近一次金融系统性能优化中这套配置帮助团队将平均查询响应时间从320ms降低到210ms同时成功识别出三个执行时间超过5秒的复杂报表查询为后续的索引优化提供了明确方向。

相关文章:

Spring Boot项目SQL执行监控实战:手把手集成P6spy,自定义日志格式并输出到文件

Spring Boot生产环境SQL监控全方案:P6spy高阶配置与日志持久化实战 当你负责的电商系统在促销活动期间突然出现响应迟缓,或是金融交易系统在月末结算时频繁超时,数据库查询性能往往是首要怀疑对象。但生产环境的数据库通常不允许直接连接进行…...

ReaR实战:构建企业级Linux裸机灾难恢复体系

1. 为什么企业需要裸机灾难恢复方案 想象一下这样的场景:凌晨三点,机房突然响起刺耳的警报声。值班工程师冲进机房,发现核心数据库服务器已经宕机,硬盘指示灯全灭——这是一次严重的硬件故障。更糟糕的是,这台服务器上…...

3MF格式与Blender从入门到精通:重塑3D打印工作流

3MF格式与Blender从入门到精通:重塑3D打印工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 概念解析:为什么3MF正在取代STL成为行业新标准 …...

抖音音频提取工具 v1.0 - 快速提取抖音视频音频

抖音音频提取工具 v1.0 是可快速提取抖音短视频音频并保存本地的实用工具,依托 WebView2 与 FFmpeg 技术实现,操作简单易上手,能满足车机播放等个人娱乐音频使用需求,工具仅支持个人娱乐使用。抖音音频提取工具 v1.0 抖音短视频音…...

洛谷 P1833:樱花 ← 混合背包(01 + 完全 + 多重)

【题目来源】 https://www.luogu.com.cn/problem/P1833 【题目描述】 爱与愁大神后院里种了 n 棵樱花树&#xff0c;每棵都有美学值 Ci(0<Ci≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸&#xff0c;他懂得如何欣赏樱花&#xff1a;一种樱花树看一遍…...

CodeSys WebVisu避坑指南:用three.js给机械臂做3D可视化,我踩过的8个坑

CodeSys WebVisu与three.js深度整合实战&#xff1a;机械臂3D可视化开发避坑手册 在工业自动化领域&#xff0c;机械臂的实时状态可视化一直是HMI开发中的难点与痛点。传统解决方案往往受限于渲染效果和交互灵活性&#xff0c;而基于WebGL的three.js技术栈恰好能弥补这些不足。…...

洛谷 P1507:NASA的食物计划 ← 二维费用0/1背包问题

【题目来源】 https://www.luogu.com.cn/problem/P1507 【题目背景】 NASA&#xff08;美国航空航天局&#xff09;因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋&#xff0c;因此在各方压力下终止了航天飞机的历史&#xff0c;但是此类事情会不会在以后发生&#xff0…...

告别手动编码烦恼:用CANopenEditor高效定制CANopenNode对象字典

告别手动编码烦恼&#xff1a;用CANopenEditor高效定制CANopenNode对象字典 【免费下载链接】CANopenNode CANopen protocol stack 项目地址: https://gitcode.com/gh_mirrors/ca/CANopenNode 你是否曾为CANopenNode项目中繁琐的对象字典配置而头疼&#xff1f;手动编写…...

Deepin Boot Maker:智能解析引擎驱动的跨平台启动盘制作方案

Deepin Boot Maker&#xff1a;智能解析引擎驱动的跨平台启动盘制作方案 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker Deepin Boot Maker是一款采用智能解析引擎的跨平台开源工具&#xff0c;通过自动化流程与硬…...

便携激光云高仪:精确测量云底高度、云层厚度等关键参数

便携激光云高仪是一种用于测量云层高度、厚度及分布情况的气象观测设备&#xff0c;广泛应用于气象监测、航空安全、环境研究等领域。其便携式设计特别适合野外作业和临时观测需求。设备通过激光脉冲探测云底高度&#xff0c;并实时分析云层垂直结构&#xff0c;为气象预报、灾…...

别再只看灰度图了!用功率谱给你的AI生成图像质量把把脉

功率谱分析&#xff1a;AI生成图像质量评估的隐藏利器 当我们在评估AI生成的图像时&#xff0c;常常会陷入主观判断的陷阱——肉眼观察虽然直观&#xff0c;但缺乏量化标准。而功率谱分析这一源自信号处理的技术&#xff0c;正悄然成为AI图像质量评估领域的一把精准尺子。不同于…...

AI首推路径控制引擎

AI首推路径控制引擎版本&#xff1a;v2.0.0 发布日期&#xff1a;2026年3月26日 发布状态&#xff1a;正式全量发布---一、背景与概述在AI生成式应用中&#xff0c;模型输出的随机性与不可控性一直是业务落地的核心痛点。为解决“如何让AI严格遵循预设逻辑生成答案”的问题&…...

3大创新让你的设备静如耳语:智能风扇控制技术全解析

3大创新让你的设备静如耳语&#xff1a;智能风扇控制技术全解析 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...

FindSomething:革新性网页智能信息提取工具完全指南

FindSomething&#xff1a;革新性网页智能信息提取工具完全指南 【免费下载链接】FindSomething 基于chrome、firefox插件的被动式信息泄漏检测工具 项目地址: https://gitcode.com/gh_mirrors/fi/FindSomething 在数字时代&#xff0c;网页中隐藏的敏感信息和数据模式往…...

【图像加密解密】基于Halton 序列图像加密解密位置扰乱和像素扰乱(含相关性分析)附Matlab代码

作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真关注我领取海量matlab电子书和数学建模资料 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真咨询内容私信。&#x1f52…...

OCLP-Mod:终极指南 - 让老旧Mac免费升级到最新macOS

OCLP-Mod&#xff1a;终极指南 - 让老旧Mac免费升级到最新macOS 【免费下载链接】OCLP-Mod A mod version for OCLP,with more interesting features. 项目地址: https://gitcode.com/gh_mirrors/oc/OCLP-Mod 你是否拥有一台被苹果官方"抛弃"的老旧Mac&#x…...

快马平台快速原型:十分钟用AI生成你的第一个龙虾养殖系统Docker部署方案

最近在研究如何用Docker快速搭建一个龙虾养殖模拟系统&#xff0c;发现用InsCode(快马)平台可以大大简化这个过程。作为一个快速原型验证工具&#xff0c;它让我在十分钟内就完成了从构思到部署的全流程。下面分享下我的实践心得&#xff1a; 项目构思阶段 这个模拟系统需要展示…...

OpenClaw多用户方案:QwQ-32B共享环境下的权限隔离

OpenClaw多用户方案&#xff1a;QwQ-32B共享环境下的权限隔离 1. 为什么需要多用户方案&#xff1f; 去年我在家里搭建了一个OpenClaw自动化环境&#xff0c;原本只是个人使用。直到某天家人看到我用语音指令让AI自动整理照片、生成周报后&#xff0c;纷纷要求"共享&quo…...

LeetCode 2946. 循环移位后的矩阵相似检查【数学周期性+原地比较】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

FLUX.1-dev像素生成器效果对比:不同Scale值对像素结构强度影响实测

FLUX.1-dev像素生成器效果对比&#xff1a;不同Scale值对像素结构强度影响实测 1. 像素艺术生成技术概述 像素幻梦&#xff08;Pixel Dream Workshop&#xff09;是基于FLUX.1-dev扩散模型构建的专业像素艺术生成工具。它采用16-bit现代明亮风格设计&#xff0c;为创作者提供…...

Phi-4-Reasoning-Vision入门指南:图文推理结果JSON结构与API对接说明

Phi-4-Reasoning-Vision入门指南&#xff1a;图文推理结果JSON结构与API对接说明 1. 工具概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双NVIDIA RTX 4090显卡环境优化。该工具严格遵循官方SYSTEM …...

告别手动操作!用Word宏/VBA实现doc批量转docx的隐藏技巧

职场效率革命&#xff1a;Word宏/VBA零代码实现文档格式批量升级 每天面对堆积如山的.doc文件&#xff0c;行政文员小张总要手动打开每个文件另存为.docx格式——这个机械操作不仅耗时费力&#xff0c;还容易遗漏文件。其实微软Office内置的自动化工具能完美解决这个问题&#…...

如何解决3D视频无法在普通设备播放的难题?VR-Reversal让转换更简单

如何解决3D视频无法在普通设备播放的难题&#xff1f;VR-Reversal让转换更简单 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitco…...

如何3步实现ComfyUI-Manager配置加密?揭秘敏感数据保护全方案

如何3步实现ComfyUI-Manager配置加密&#xff1f;揭秘敏感数据保护全方案 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 在使用ComfyUI-Manager管理自定义节点和模型时&#xff0c;配置文件中往往包含API密钥、数据库…...

别再只懂概念了!用JSEncrypt库5分钟搞定前端RSA密码加密实战

前端RSA加密实战&#xff1a;用JSEncrypt保护用户密码传输安全 1. 为什么前端需要加密&#xff1f; 在Web应用开发中&#xff0c;用户登录是最基础也最敏感的操作之一。传统表单提交直接将密码以明文形式发送到服务器&#xff0c;这在网络传输过程中存在被截获的风险。即使使…...

海康WEBSDK无插件版实战:零基础构建WEB端网络摄像机实时监控系统

1. 环境准备&#xff1a;5分钟搞定基础配置 第一次接触海康WEBSDK无插件版时&#xff0c;我也被那些专业术语吓到过。但实际操作后发现&#xff0c;只要准备好三样东西就能开工&#xff1a;一台能联网的电脑、海康网络摄像机、以及从官网下载的开发包。这里分享几个新手容易踩的…...

使用PyTorch Lightning优化PETRV2-BEV模型训练流程

使用PyTorch Lightning优化PETRV2-BEV模型训练流程 如果你正在训练像PETRV2这样的BEV感知模型&#xff0c;可能已经体会过那种“一步一坑”的感觉。数据加载复杂、多GPU训练配置繁琐、日志记录混乱、实验难以复现……这些工程上的琐事&#xff0c;常常比模型本身更让人头疼。 …...

手把手教你用SteamCMD在Windows服务器上搭建Rust腐蚀私服(附详细参数配置)

手把手教你用SteamCMD在Windows服务器上搭建Rust腐蚀私服&#xff08;附详细参数配置&#xff09; 在生存游戏领域&#xff0c;Rust以其硬核的PVP机制和高度自由的沙盒玩法&#xff0c;持续吸引着大量玩家。对于想要掌控游戏规则、打造专属社区的管理员来说&#xff0c;自建服…...

极速上手:Puppeteer + 原生代理IP 突破无头检测(金融与突发新闻抓取 Cheat Sheet)

在金融量化分析、宏观经济数据追踪或突发新闻监控等场景中&#xff0c;数据价值随时间呈指数级衰减。高频并发抓取极易触发目标网站的反爬策略&#xff08;如 Cloudflare 盾、无头浏览器指纹识别&#xff09;以及严苛的 IP 封禁。 终极解法&#xff1a; 使用 puppeteer-extra-…...

Charticulator:数据可视化的自由创作平台与技术革命

Charticulator&#xff1a;数据可视化的自由创作平台与技术革命 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 当数据分析师面对预设模板无法表达复杂数据关系时…...