今天要新搭一个项目框架,其中要解决的一个问题是,将所有执行的sql打印到日志,放到一个文件中,注意打印的不是预编译待问号的sql,而是真正能放在数据库中执行的sql,这样更直观,更简单。(本项目是springboot项目)
一.是什么
P6Spy 是针对数据库访问操作的动态监测框架,它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改
二.作用
无缝截取和操控数据库数据
三.实现
-
在pom文件中添加p6spy的依赖
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.8.0</version> </dependency>
-
下载p6spy的jar包,将里面的spy.properties文件拷贝到resources目录下,主要做了如下修改
#系统使用的真正的数据库驱动程序名称 driverlist=com.mysql.jdbc.Driver # 监测属性配置文件是否进行重新加载,默认是false reloadproperties=true # 指定 Log 的 appender appender=com.p6spy.engine.spy.appender.Slf4JLogger logMessageFormat=com.dmsdbj.itoo.tool.p6spy.P6SpyLogger databaseDialectDateFormat=yyyy-MM-dd HH:mm:ss # 显示指定过滤log时包含的分类 excludecategories=info,debug,result,resultset
配置项名称 | 默认值 | 配置项意义及相关注意事项 |
---|---|---|
module.log | com.p6spy.engine.logging. P6LogFactory | 用来拦截和记录任务应用程序的 JDBC 语句。若无配置或注释掉则无此功能。 |
module.outage | com.p6spy.engine.outage. P6OutageFactory | 检测和记录执行时间比较长的 SQL 语句。若无配置或注释掉则无此功能。 |
realdriver | | 真正的应用系统应用的数据库驱动程序名称。 |
realdriver2 | | 真正的应用系统应用的第二种备用数据库驱动程序名称。 |
realdriver3 | | 真正的应用系统应用的第三种备用数据库驱动程序名称。 |
deregisterdrivers | false | 显示地把真正的数据库的驱动程序停止反注册掉。取值 true| false |
executionthreshold | | P6Log 模块执行时间设置,整数值 (以毫秒为单位),只有当超过这个时间才停止记录 Log。 |
outagedetection | false | P6Outage 模块是否记录较长时间运行的语句。取值 true| false |
outagedetectioninterval | | P6Outage 模块执行时间设置,整数值 (以秒为单位)),只有当超过这个时间才停止记录 Log。 |
filter | false | 是否过滤 Log,取值 true| false |
include | | 过滤 Log 时所包含的表名列表,以逗号分隔。 |
exclude | | 过滤 Log 时所排除的表名列表,以逗号分隔。 |
sqlexpression | | 过滤 Log 时的 SQL 表达式名称 |
autoflush | true | 是否自动刷新。取值 true| false |
dateformat | | 设置时间的格式,也就是用 Java 的 SimpleDateFormat 程序。 |
includecategories | | 显示指定过滤 Log 时包含的分类列表,取值为 error,info,batch,debug,statement,commit,rollback,result 的各种组合。 |
excludecategories | | 显示指定过滤 Log 时排队的分类列表,取值同上。 |
stringmatcher | | 应用正则表达式来过滤 Log,取值为 com.p6spy.engine.common.GnuRegexMatcher 和 com.p6spy.engine.common.JakartaRegexMatcher |
stacktrace | false | 打印堆栈跟踪信息。取值 true| false |
stacktraceclass | | 如果 stacktrace=true,则可以指定具体的类名来停止过滤。 |
reloadproperties | false | 监测属性配置文件是否停止重新加载。取值 true| false |
reloadpropertiesinterval | 60 | 属性配置文件重新加载的时间间隔,以秒为单位。 |
useprefix | false | 是否加上前缀,设置为 true,会加上 p6spy: 作为前缀。取值 true| false |
appender | com.p6spy.engine.logging. appender.FileLogger | 指定 Log 的 appender,与 Log4J 有点同义,取值:com.p6spy.engine.logging.appender.Log4jLogger、com.p6spy.engine.logging.appender.StdoutLogger:表示将输出的SQL或者日志信息输出到Console窗口 和 com.p6spy.engine.logging.appender.FileLogger |
logfile | spy.log | 指定 Log 的文件名,任何适于操作系统的文件。 |
append | true | 指定是否每次是增加 Log,设置为 false 则每次都会先停止清空。取值 true| false |
log4j.appender.STDOUT | org.apache.log4j.ConsoleAppender | 当 appender 为 log4j 时采用的配置,配置如同 Log4J 的相关配置。 |
log4j.appender.STDOUT.layout | org.apache.log4j.PatternLayout | 同上 |
log4j.appender.STDOUT. layout.ConversionPattern | p6spy - %m%n | 同上 |
log4j.logger.p6spy | INFO,STDOUT | Log 级别的设置,取值同 Log4J 的配置 |
realdatasource | | 设置数据源 DataSource 的配置名称。 |
realdatasourceclass | | 设置数据源 DataSource 的类的全称。 |
realdatasourceproperties | | 设置数据源 DataSource 的属性,以分号分隔。 |
jndicontextfactory | | 设置 JNDI 数据源的 NamingContextFactory。 |
jndicontextproviderurl | | 设置 JNDI 数据源的提供者的 URL。 |
jndicontextcustom | | 设置 JNDI 数据源的一些定制信息,以分号分隔。 |
-
工程的数据库驱动换位p6spy驱动
datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.p6spy.engine.spy.P6SpyDriver url: jdbc:p6spy:mysql://localhost:3306/intern?autoReconnect=true&useSSL=false&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull username: root password: root