引言

最近换了号称最快的HikariDataSource,由于没有了SQL监控,加之于Mybaits默认输出日志之拙计。遂用此物,与之相仿还有log4jdbc,比较活跃度后选择了P6Spy

版本

  • P6Sspy: 3.7
  • Gradle: 4.10
  • Spring Boot: 2.0.4

步骤

具体步骤比较简单,这里说下简单原理。P6Spy通过劫持JDBC驱动,在调用实际JDBC驱动前拦截调用的目标语,达到SQL语句日志记录的目的。

它包括P6LogP6Outage两个模块。

  • P6Log 用来拦截和记录任务应用程序的 JDBC 语句
  • P6Outage 专门用来检测和记录超过配置条件里时间的 SQL 语句

应用P6Spy只需要

  • 1.替换你的JDBC Drivercom.p6spy.engine.spy.P6SpyDriver
  • 2.修改JDBC Urljdbc:p6spy:xxxx
  • 3.配置spy.properties

1.修改application.yml文件,替换jdbc driverurl

# 数据源
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:p6spy:mysql://...
username: ...
password: ...
driver-class-name: com.p6spy.engine.spy.P6SpyDriver

2.配置spy.properties

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=org.pkaq.core.log.P6SpyLogger
# 使用日志系统记录sql
appender=com.p6spy.engine.spy.appender.Slf4JLogger
## 配置记录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.自定义日志打印 , 这里有两种方式

一、实现MessageFormattingStrategy接口

public class P6SpyLogger implements MessageFormattingStrategy {

    @Override
public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
return !"".equals(sql.trim()) ? "[ " + LocalDateTime.now() + " ] --- | took "
+ elapsed + "ms | " + category + " | connection " + connectionId + "\n "
+ sql + ";" : "";
}
}

二、在 spy.properties中指定

# 自定义日志打印
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime) | SQL耗时: %(executionTime) ms | 连接信息: %(category)-%(connectionId) | 执行语句: %(sql)

附录: spy.properties详细说明

# 指定应用的日志拦截模块,默认为com.p6spy.engine.spy.P6SpyFactory
#modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory # 真实JDBC driver , 多个以 逗号 分割 默认为空
#driverlist= # 是否自动刷新 默认 flase
#autoflush=false # 配置SimpleDateFormat日期格式 默认为空
#dateformat= # 打印堆栈跟踪信息 默认flase
#stacktrace=false # 如果 stacktrace=true,则可以指定具体的类名来进行过滤。
#stacktraceclass= # 监测属性配置文件是否进行重新加载
#reloadproperties=false # 属性配置文件重新加载的时间间隔,单位:秒 默认60s
#reloadpropertiesinterval=60 # 指定 Log 的 appender,取值:
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
#appender=com.p6spy.engine.spy.appender.StdoutLogger
#appender=com.p6spy.engine.spy.appender.FileLogger # 指定 Log 的文件名 默认 spy.log
#logfile=spy.log # 指定是否每次是增加 Log,设置为 false 则每次都会先进行清空 默认true
#append=true # 指定日志输出样式 默认为com.p6spy.engine.spy.appender.SingleLineFormat , 单行输出 不格式化语句
#logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
# 也可以采用 com.p6spy.engine.spy.appender.CustomLineFormat 来自定义输出样式, 默认值是%(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine)
# 可用的变量为:
# %(connectionId) connection id
# %(currentTime) 当前时间
# %(executionTime) 执行耗时
# %(category) 执行分组
# %(effectiveSql) 提交的SQL 换行
# %(effectiveSqlSingleLine) 提交的SQL 不换行显示
# %(sql) 执行的真实SQL语句,已替换占位
# %(sqlSingleLine) 执行的真实SQL语句,已替换占位 不换行显示
#customLogMessageFormat=%(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine) # date类型字段记录日志时使用的日期格式 默认dd-MMM-yy
#databaseDialectDateFormat=dd-MMM-yy # boolean类型字段记录日志时使用的日期格式 默认boolean 可选值numeric
#databaseDialectBooleanFormat=boolean # 是否通过jmx暴露属性 默认true
#jmx=true # 如果jmx设置为true 指定通过jmx暴露属性时的前缀 默认为空
# com.p6spy(.<jmxPrefix>)?:name=<optionsClassName>
#jmxPrefix= # 是否显示纳秒 默认false
#useNanoTime=false # 实际数据源 JNDI
#realdatasource=/RealMySqlDS
# 实际数据源 datasource class
#realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource # 实际数据源所携带的配置参数 以 k=v 方式指定 以 分号 分割
#realdatasourceproperties=port;3306,serverName;myhost,databaseName;jbossdb,foo;bar # jndi数据源配置
# 设置 JNDI 数据源的 NamingContextFactory。
#jndicontextfactory=org.jnp.interfaces.NamingContextFactory
# 设置 JNDI 数据源的提供者的 URL。
#jndicontextproviderurl=localhost:1099
# 设置 JNDI 数据源的一些定制信息,以分号分隔。
#jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.naming:org.jnp.interfaces # 是否开启日志过滤 默认false, 这项配置是否生效前提是配置了 include/exclude/sqlexpression
#filter=false # 过滤 Log 时所包含的表名列表,以逗号分隔 默认为空
#include=
# 过滤 Log 时所排除的表名列表,以逗号分隔 默认为空
#exclude= # 过滤 Log 时的 SQL 正则表达式名称 默认为空
#sqlexpression= #显示指定过滤 Log 时排队的分类列表,取值: error, info, batch, debug, statement,
#commit, rollback, result and resultset are valid values
# (默认 info,debug,result,resultset,batch)
#excludecategories=info,debug,result,resultset,batch # 是否过滤二进制字段
# (default is false)
#excludebinary=false # P6Log 模块执行时间设置,整数值 (以毫秒为单位),只有当超过这个时间才进行记录 Log。 默认为0
#executionThreshold= # P6Outage 模块是否记录较长时间运行的语句 默认false
# outagedetection=true|false
# P6Outage 模块执行时间设置,整数值 (以秒为单位)),只有当超过这个时间才进行记录 Log。 默认30s
# outagedetectioninterval=integer time (seconds)
 
 

使用P6Spy监控你的Spring boot数据库操作的更多相关文章

  1. spring boot数据库操作汇总

    1 关于orm orm即object relational mapping,对象关系映射,即将数据库中的表映射成对象. 常用的orm有以下: mybatis spring jdbc template ...

  2. Springboot 系列(十七)迅速使用 Spring Boot Admin 监控你的 Spring Boot 程序,支持异常邮件通知

    1. Spring Boot Admin 是什么 Spring Boot Admin 是由 codecentric 组织开发的开源项目,使用 Spring Boot Admin 可以管理和监控你的 S ...

  3. spring boot 入门操作(二)

    spring boot入门操作 使用FastJson解析json数据 pom dependencies里添加fastjson依赖 <dependency> <groupId>c ...

  4. spring boot 入门操作(三)

    spring boot入门操作 devtools热部署 pom dependencies里添加依赖 <dependency> <groupId>org.springframew ...

  5. 如何做实时监控?—— 参考 Spring Boot 实现

    随着 微服务 的流行,相比较以前一个大型应用程序搞定所有需求,我们现在更倾向于把大型应用程序切分成多个微服务,服务之间通过 RPC 调用.微服务架构的好处非常多,例如稳定的服务变化较少,不会被非稳定服 ...

  6. 如何做实时监控?—— 参考 Spring Boot 实现(转)

    转自:http://blog.csdn.net/xiaoyu411502/article/details/48129057 随着 微服务 的流行,相比较以前一个大型应用程序搞定所有需求,我们现在更倾向 ...

  7. Spring Boot数据库交互

    在上篇文件的基础上进行开发,简单实现一下增.查操作,删除和修改类似,作为一个demo就暂时不做重复工作了,实现原理类似 IDEA创建Spring Boot项目 项目结构 新建MySQL数据库相关信息 ...

  8. SpringBoot | 第二十八章:监控管理之Spring Boot Admin使用

    前言 上一章节,我们介绍了Actuator的使用,知道了可通过访问不同的端点路径,获取相应的监控信息.但使用后也能发现,返回的监控数据都是以JSON串的形式进行返回的,对于实施或者其他人员来说,不是很 ...

  9. Spring Boot 实际操作

    1.什么是springboot 2.springboot的很多默认编码方式都是utf-8,真是福利啊. 3.spring boot如何启动和访问和MocMvc测试 4.开发环境的调试热启动 5.app ...

  10. Spring Boot简单操作

    目录 一.自定义异常页面 二.单元测试 ​三.多环境选择 四.读取主配置文件中的属性 五.读取List属性 一.自定义异常页面 对于404.405.500等异常状态,服务器会给出默认的异常页面,而这些 ...

随机推荐

  1. pytorch中y.data.norm()的含义

    import torch x = torch.randn(3, requires_grad=True) y = x*2 print(y.data.norm()) print(torch.sqrt(to ...

  2. 忽略某个已经托管给git的文件,防止二次提交

    # 执行命令将文件加入不提交队列 git update-index --assume-unchanged 你的文件路径 # 执行命令将文件取消加入不提交队列 git update-index --no ...

  3. 何为ORM框架?和ADO.NET 对比

    百度:ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中.简单理解为一种框架的格式 . 只 ...

  4. 自签openssl证书(包含泛域名)

    1.安装openSSL weget http://www.openssl.org/source/openssl-1.0.0a.tar.gz Tar -zxvf openssl-1.0.0a.tar.g ...

  5. Python如何完成一个上课点名系统!

    阅读目录 一.准备工作 二.预览 三.思路 四.源代码 五.总结 一.准备工作 1.Tkinter Tkinter 是 python 内置的 TK GUI 工具集.TK 是 Tcl 语言的原生 GUI ...

  6. 「模拟赛」多校 A 层联训 15

    比赛链接 A. 追逐游戏 (chase) 没啥意义的水题,但赛时没调出来. 分讨,LCA 设 \(S\) 和 \(T\) 的 LCA 为 \(lca\) \(S'\) 为 \(lca\) 的祖先节点的 ...

  7. SparkSQL练习:对学生选课成绩进行分析计算

    题目内容: 对学生选课成绩进行分析计算 题目要求: (1)该系总共有多少学生: (2)该系共开设来多少门课程: (3)每个学生的总成绩多少: (4)每门课程选修的同学人数: (5)每位同学选修的课程门 ...

  8. AI千恋万花(java调用api实现)附完整项目及注释)重置版)

    感觉博客的第一版质量有点低下了,删了重置一下,希望能给其他人的代码带来一些灵感 前情提要:https://www.cnblogs.com/h4o3/p/18523151 由于是匆忙制作的老婆系统,主界 ...

  9. P4229 某位歌姬的故事

    P4229 某位歌姬的故事 处理复杂点的 dp 题. 思路 先考虑 \(n\) 比较小的情况,把每个询问放到线段上,发现每个格子只能满足覆盖最小的限制,于是考虑将询问有效区间排序考虑. 设 \(f[i ...

  10. rabbitmq消息中间件的初步探索

    在上次学xattr的时候用它简单实现一个中间件,我去了解了一下rabbitmq这个消息中间件,感觉理论上还是挺好用的,给一般并发量的系统用足够了. 首先安装这个服务. sudo apt search ...