Java网络项目调试时打印sql信息?
在日常开发过程中调试是十分频繁的事情,辅助调试的重要手段就是日志。除了业务日志,很多时候破解惨案的入口都在数据库查询上,因此被执行SQL的日志也很重要。
线上环境由于sql量极大,并不会启用sql的打印,否则不仅日志文件打开一看全是垃圾SQL,而且日志文件很快就占满了磁盘。但是测试时如果能记录sql对于排错就会是很方便的事情。
有的公司配置了sql的日志框架,将日志级别设在info以下,并在测试环境打印其级别日志。线上只要设置日志级别高一点就可避免日志输出。
但是如果公司没提供这样的支持,任何环境都不能输出sql该怎么办?
这里就介绍两种常用的日志打印方案:p6spy和log4jdbc。
p6spy
要使用p6spy,需要先引入其依赖。它的maven坐标是
<dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.0.0</version></dependency>
然后在数据源的配置中修改驱动类和连接类型:
spring.datasource.driverClassName=com.p6spy.engine.spy.P6SpyDriverspring.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#使用日志系统记录sqlappender=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.DriverSpyspring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/table_name
log4jdbc是特意为了整合日志的,所以直接就输出到日志文件了。以log4j为例,在日志配置文件中增加log4j.logger.jdbc.sqlonly=OFFlog4j.logger.jdbc.sqltiming=INFOlog4j.logger.jdbc.audit=OFFlog4j.logger.jdbc.resultset=OFFlog4j.logger.jdbc.connection=OFF
现在sql就可以打印出来了,当然也是可执行的sql,并且sql的执行时长也打印了出来。
希望今天的内容帮到大家