MyBatis Plus與P6Spy日志配置

前言

在開發基于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

復習日 浙大疏錦行