SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印
前言
在項(xiàng)目中對(duì)數(shù)據(jù)庫(kù)中進(jìn)行操作調(diào)試的時(shí)候,最重要的一個(gè)功能就是SQL打印。
如果使用Mybatis-plus的話,他會(huì)自帶一個(gè)SQL打印的功能。雖然它可以打印,但我覺(jué)得還不夠優(yōu)雅,因?yàn)榘芏辔覀儾恍枰男畔?,所以這篇文章實(shí)現(xiàn)一下在代碼中優(yōu)雅的打印SQL。
介紹
P6spy是什么?
P6Spy 是針對(duì)數(shù)據(jù)庫(kù)訪問(wèn)操作的動(dòng)態(tài)監(jiān)測(cè)框架(為開(kāi)源項(xiàng)目,項(xiàng)目首頁(yè):www.p6spy.com)它使得數(shù)據(jù)庫(kù)數(shù)據(jù)可無(wú)縫截取和操縱,而不必對(duì)現(xiàn)有應(yīng)用程序的代碼作任何修改。P6Spy 分發(fā)包包括P6Log,它是一個(gè)可記錄任何 Java 應(yīng)用程序的所有JDBC事務(wù)的應(yīng)用程序。其配置完成使用時(shí),可以進(jìn)行數(shù)據(jù)訪問(wèn)性能的監(jiān)測(cè)。
我們最需要的功能,查看sql語(yǔ)句,不是預(yù)編譯的帶問(wèn)號(hào)的哦,而是真正的數(shù)據(jù)庫(kù)執(zhí)行的sql,更直觀,更簡(jiǎn)單。
使用
1 導(dǎo)入相關(guān)依賴
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>${version:}</version>//目前最新版3.9.1 </dependency>
2 修改application.yml配置文件,只需要將連接和驅(qū)動(dòng)進(jìn)行修改
url: jdbc:p6spy:mysql://localhost:3306/db1_datasource driver-class-name: com.p6spy.engine.spy.P6SpyDriver
3 新增spy.properties文件
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory appender=com.p6spy.engine.spy.appender.StdoutLogger excludecategories=info,debug,result,batc,resultset deregisterdrivers=true dateformat=yyyy-MM-dd HH:mm:ss driverlist=com.mysql.cj.jdbc.Driver outagedetection=true outagedetectioninterval=2 #自定義SQL打印處理類(lèi) logMessageFormat=com.xxx.xxx.P6SpyLogger
4 新增P6SpyLogger,處理打印的SQL語(yǔ)句
import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import java.text.SimpleDateFormat; import java.util.Date; public class P6SpyLogger implements MessageFormattingStrategy { ? ? private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); ? ? /** ? ? ?* 自定義sql日志打印 ? ? ?* ? ? ?* @param connectionId 連接標(biāo)識(shí) ? ? ?* @param now ? ? ? ? ?執(zhí)行時(shí)間 ? ? ?* @param elapsed ? ? ?執(zhí)行秒數(shù)ms ? ? ?* @param category ? ? statement ? ? ?* @param prepared ? ? 準(zhǔn)備sql語(yǔ)句 ? ? ?* @param sql ? ? ? ? ?sql語(yǔ)句 ? ? ?* @param s4 ? ? ? ? ? 數(shù)據(jù)庫(kù)url連接 ? ? ?* @return {@link String} ? ? ?*/ ? ? @Override ? ? public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String s4) { ? ? ? ? System.out.println(); ? ? ? ? if (!"".equals(sql.trim())) { ? ? ? ? ? ? String sqlBegin = "============== SQL LOGGER BEGIN =============="; ? ? ? ? ? ? String sqlExecuteTime = "SQL 執(zhí)行時(shí)間 ? ? ? :" + this.format.format(new Date()) + "\n"; ? ? ? ? ? ? String elapsedStr = "SQL 執(zhí)行毫秒 ? ? ? :" + elapsed + "ms" + "\n"; ? ? ? ? ? ? String sqlPrint = "SQL 執(zhí)行語(yǔ)句 ? ? ? :" + sql; ? ? ? ? ? ? //String sqlPrint = !"".equals(sql.trim()) ? this.format.format(new Date()) + " | took " + elapsed + "ms | " + category + " | connection " + connectionId + "\n " + sql + ";" : ""; ? ? ? ? ? ? String sqlEnd = "============== ?SQL LOGGER END ?=============="; ? ? ? ? ? ? return sqlBegin + "\r\n" + sqlExecuteTime + elapsedStr + sqlPrint + "\r\n" + sqlEnd; ? ? ? ? } ? ? ? ? return ""; ? ? } }
5 查看SQL打印效果
============== SQL LOGGER BEGIN ==============
SQL 執(zhí)行時(shí)間 :2023-07-12 11:37:43:296
SQL 執(zhí)行毫秒 :5ms
SQL 執(zhí)行語(yǔ)句 :select * from db2_user
============== SQL LOGGER END ==============
============== SQL LOGGER BEGIN ==============
SQL 執(zhí)行時(shí)間 :2023-07-12 11:37:47:707
SQL 執(zhí)行毫秒 :1ms
SQL 執(zhí)行語(yǔ)句 :select * from db1_user where age = 18 order by create_time desc
============== SQL LOGGER END ==============
總結(jié)
可以根據(jù)方法的參數(shù)進(jìn)行不同的搭配來(lái)實(shí)現(xiàn)優(yōu)雅的SQL打印
到此這篇關(guān)于SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印的文章就介紹到這了,更多相關(guān)SpringBoot P6spy自定義SQL打印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud OpenFeign基本介紹與實(shí)現(xiàn)示例
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開(kāi)發(fā),讓開(kāi)發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02Java向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)后獲取自增ID的常用方法
有時(shí)候因?yàn)樾略龅男枨笮枰@取剛剛新增的數(shù)據(jù)的自增的主鍵ID,下面這篇文章主要給大家介紹了關(guān)于Java向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)后獲取自增ID的常用方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11EL調(diào)用Java方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
簡(jiǎn)單來(lái)說(shuō),我們?cè)谝粋€(gè)類(lèi)中的某個(gè)方法,可以使用EL進(jìn)行調(diào)用,這個(gè)能被EL表達(dá)式調(diào)用的方法稱之為EL函數(shù),但是這種方式必須滿足兩點(diǎn)要求,具體哪兩點(diǎn),大家可以參考下本文2017-07-07全網(wǎng)最新springboot整合mybatis-plus的過(guò)程
在本文中,介紹了 MyBatis-Plus 的核心功能和使用方法,包括如何配置分頁(yè)插件、編寫(xiě)分頁(yè)查詢代碼、使用各種 Wrapper 構(gòu)建復(fù)雜查詢條件等,通過(guò)這些內(nèi)容,相信你已經(jīng)對(duì) MyBatis-Plus 有了更深入的了解,并能夠在實(shí)際項(xiàng)目中靈活應(yīng)用這些功能,感興趣的朋友跟隨小編一起看看吧2025-02-02詳解Servlet3.0新特性(從注解配置到websocket編程)
Servlet3.0的出現(xiàn)是servlet史上最大的變革,其中的許多新特性大大的簡(jiǎn)化了web應(yīng)用的開(kāi)發(fā),為廣大勞苦的程序員減輕了壓力,提高了web開(kāi)發(fā)的效率。2017-04-04淺談Springboot實(shí)現(xiàn)攔截器的兩種方式
本文詳細(xì)的介紹了Springboot攔截器的兩種方式實(shí)現(xiàn),一種就是用攔截器,一種就是過(guò)濾器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08基于Java中進(jìn)制的轉(zhuǎn)換函數(shù)詳解
下面小編就為大家?guī)?lái)一篇基于Java中進(jìn)制的轉(zhuǎn)換函數(shù)詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07