文章目录
- 1、背景
- 2、简介
- 3、接入
- 3.1、 引入依赖
- 3.2、修改database参数:
- 3.3、 创建P6SpyLogger类,自定义日志格式
- 3.4、添加spy.properties
- 3.5、 输出样例
- 4、补充
- 4.1、参数说明
1、背景
在开发的过程中,总希望方法执行完了可以看到完整是sql语句,从而判断执行的是否正确,所以就希望有一个可以打印sql语句的插件。
2、简介
p6spy 是数据库动态监控的一种框架,是一个可以用来监控JDBC执行语句的开源产品,它可以使得数据库数据无缝拦截和操作,而不必对现有应用程序的代码作任何修改。利用p6spy很容易的就能监控到JDBC中执行的SQL语句,便于系统调试和性能调优。p6spy分发包括P6Log,它是一个可记录任何Java应用程序的所有JDBC事务的应用程序。其配置完成使用时,可以进行数据访问性能的监测。
p6spy 实现原理是对JDBC的关键类进行了一次包装,让应用系统调用自己的类;自己的类截获到SQL语句后再调用真实的JDBC驱动进行执行SQL,这样,在自己的类里面就可以监控到所有的SQL语句。
GitHub地址:https://github.com/p6spy/p6spy
官网地址:https://p6spy.readthedocs.io/en/latest/index.html#
仓库地址:https://mvnrepository.com/artifact/p6spy/p6spy
3、接入
3.1、 引入依赖
gradle:
// https://mvnrepository.com/artifact/p6spy/p6spy
implementation 'p6spy:p6spy:3.9.1'
maven:
<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
3.2、修改database参数:
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://XXXX:3306/datasource?characterEncoding=utf8
3.3、 创建P6SpyLogger类,自定义日志格式
package com.XXX.config;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author :
* @date :Created in 14:45 2023/7/25
* @description :
* @version: 1.0
*/
public class P6SpyLogger implements MessageFormattingStrategy {
private SimpleDateFormat format = 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 s4) {
return !"".equals(sql.trim())
? this.format.format(new Date()) + "[INFO] | took " + elapsed + "ms | " + category + "\n " + sql + ";"
: "[INFO][]";
}
}
3.4、添加spy.properties
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
# 自定义P6SpyLogger类的地址
logMessageFormat=com.XXX.config.P6SpyLogger
# 使用日志系统记录sql
appender=com.p6spy.engine.spy.appender.StdoutLogger
## 配置记录Log例外
excludecategories=info,debug,result,batc,resultset
# 设置使用p6spy driver来做代理
deregisterdrivers=true
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动
driverlist=com.mysql.jdbc.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 秒
outagedetectioninterval=2
3.5、 输出样例
2023-07-25 10:22:24:090 | took 8ms | statement
select * from t_user where id = 1;