测试时的sql打印方案

发表于2019-05-26,长度2150, 102个单词, 6分钟读完
Flag Counter

在日常开发过程中调试是十分频繁的事情,辅助调试的重要手段就是日志。除了业务日志,很多时候破解惨案的入口都在数据库查询上,因此被执行SQL的日志也很重要。但是线上环境由于sql量极大,并不会启用sql的打印,否则不仅日志文件打开一看全是垃圾SQL,而且日志文件很快就占满了磁盘。但是测试时如果能记录sql对于排错就会是很方便的事情。

有的公司配置了sql的日志框架,将日志级别设在info以下,并在测试环境打印其级别日志。线上只要设置日志级别高一点就可避免日志输出。这是比较好的一种方式。但是如果公司没提供这样的支持,任何环境都不能输出sql该怎么办?当然是开发自己临时加上了!

这里就介绍两种常用的日志打印方案:p6spy和log4jdbc。

p6spy

p6spy的github地址是https://github.com/p6spy/p6spy

要使用p6spy,需要先引入其依赖。它的maven坐标是

		<dependency>
			<groupId>p6spy</groupId>
			<artifactId>p6spy</artifactId>
			<version>3.0.0</version>
		</dependency>

然后在数据源的配置中修改驱动类和链接类型:

spring.datasource.driverClassName=com.p6spy.engine.spy.P6SpyDriver
spring.datasource.url=jdbc:p6spy:mysql://localhost:3306/table_name

这样sql就能输出了,并且参数是拼接好的,而不是分别输出PreStatement和参数数组。

默认sql是输出到spy.log中的,如果想输出到控制台和程序日志中,可以在类路径下(比如src/main/resources)新建spy.properties文件,内容如下:

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 使用日志系统记录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
# 日志格式
logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat

输出的日志格式可能让你不满意,可以自己创建一个模式类实现MessageFormattingStrategy这个接口,选择方法中的参数定义格式即可。记得把spy.properties中的logMessageFormat改成自定义模式类。

更复杂的配置可以继续修改spy.properties中的类,只要提供了合适的替换就行,通常都是找到默认类,看它实现了哪个接口,自己实现一个新的。另外p6spy还可以监控慢sql,增加如下配置即可:

# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 秒
outagedetectioninterval=2

log4jdbc

log4jdbc在sourceforge上已经多年没有更新了,但是不妨碍我们使用:

<dependency>
    <groupId>com.googlecode.log4jdbc</groupId>
    <artifactId>log4jdbc</artifactId>
    <version>1.2</version>
</dependency>

同样的,也要修改数据源配置:

spring.datasource.driverClassName=net.sf.log4jdbc.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/table_name

log4jdbc是特意为了整合日志的,所以直接就输出到日志文件了。以log4j为例,在日志配置中增加

log4j.logger.jdbc.sqlonly=OFF
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF

现在sql就可以打印出来了,当然也是可执行的sql,并且sql的执行时长也打印了出来。

Written on May 26, 2019
分类: dev, 标签: java database
如果你喜欢,请赞赏! davelet