使用log4jdbc记录SQL语句的执行情况
在进行数据库开发时,我们经常需要监测SQL语句的执行情况,一般的手工编码记录、Hibernate日志记录,有如下的缺点:
- 人工记录太麻烦,需要写很多日志记录语句
- 无法获取PreparedStatement的传入参数,只能显示为"?"
log4jdbc这个小组件,恰恰解决了这些问题,其官网地址为:log4jdbc网站
该组件具有针对jdbc3、jdbc4的不同版本,如果你使用JDK1.4、1.5,可以使用log4jdbc3,使用JDK1.6以上,可以使用log4jdbc4。同时,log4jdbc需要日志记录框架的支持,建议使用SLF4J和Log4j的组合。
1 2 3 4 5 6 7 8 9 |
#标准的JDBC URL mysql://192.168.0.201:3306/gmem #使用log4jdbc时的URL jdbc:log4jdbc:mysql://192.168.0.201:3306/gmem #标准的JDBC驱动类名 com.mysql.jdbc.Driver #使用log4jdbc时的驱动类名 net.sf.log4jdbc.DriverSpy |
log4jdbc根据JDBC URL猜测你用的是哪一种数据库,并按下表确定真实的JDBC驱动类
驱动类名 | 数据库类型 |
oracle.jdbc.driver.OracleDriver | Older Oracle Driver |
oracle.jdbc.OracleDriver | Newer Oracle Driver |
com.sybase.jdbc2.jdbc.SybDriver | Sybase |
net.sourceforge.jtds.jdbc.Driver | jTDS SQL Server & Sybase driver |
com.microsoft.jdbc.sqlserver.SQLServerDriver | Microsoft SQL Server 2000 driver |
com.microsoft.sqlserver.jdbc.SQLServerDriver | Microsoft SQL Server 2005 driver |
weblogic.jdbc.sqlserver.SQLServerDriver | Weblogic SQL Server driver |
com.informix.jdbc.IfxDriver | Informix |
org.apache.derby.jdbc.ClientDriver | Apache Derby client/server driver, aka the Java DB |
org.apache.derby.jdbc.EmbeddedDriver | Apache Derby embedded driver, aka the Java DB |
com.mysql.jdbc.Driver | MySQL |
org.postgresql.Driver | PostgresSQL |
org.hsqldb.jdbcDriver | HSQLDB pure Java database |
org.h2.Driver | H2 pure Java database |
1 2 3 4 5 6 7 8 9 10 11 |
#下面的配置仅仅记录ERROR级别的日志,开发时可以适当改为DEBUG #只记录执行的SQL语句,PreparedStatement的输入参数自动替换“?” log4j.logger.jdbc.sqlonly=ERROR #记录执行的SQL语句,并统计其消耗时间 log4j.logger.jdbc.sqltiming=ERROR #记录所有JDBC的调用(针对ResultSet的除外) log4j.logger.jdbc.audit=ERROR #记录针对ResultSet的所用JDBC调用 log4j.logger.jdbc.resultset=ERROR #记录数据库连接的打开和关闭,可以用于监控连接泄漏 log4j.logger.jdbc.connection=ERROR |
此外,你可以 log4jdbc.properties这个文件中设置下表的配置项,来改变log4jdbc的行为:
配置项 | 默认值 | 描述 | 开始版本 |
log4jdbc.drivers | 一个或者多个JDBC驱动的全限定类名,逗号分隔,一般用不到该配置 | 1.0 | |
log4jdbc.auto.load.popular.drivers | true | 如果设置为false,则不会自动加载上表所属的常用驱动类 | 1.2beta2 |
log4jdbc.debug.stack.prefix | 部分或者全部的包名称,通常填写和你的应用有关的包,如果不填写,真实调用JDBC的类名称会显示在日志中——通常是连接池的类 | 1.0 | |
log4jdbc.sqltiming.warn.threshold | 指定一个毫秒数,如果执行的SQL语句超过此时间,jdbc.sqltiming则会以WARN级别记录日志 | 1.1beta1 | |
log4jdbc.sqltiming.error.threshold | 指定一个毫秒数,如果执行的SQL语句超过此时间,jdbc.sqltiming则会以ERROR级别记录日志 | 1.1beta1 | |
log4jdbc.dump.booleanastruefalse | false | 是否把日志中的布尔值显示为true/false,大部分数据库默认是显示为1/0 | 1.2alpha1 |
log4jdbc.dump.sql.maxlinelength | 90 | 日志中SQL语句每行最大的字符数,超过了则自动换行 | 1.2alpha1 |
log4jdbc.dump.fulldebugstacktrace | false | 是否显示完整的调用堆栈 | 1.2alpha1 |
log4jdbc.dump.sql.select | true | 如果设置为false,则不输出select语句到日志 | 1.2alpha1 |
log4jdbc.dump.sql.insert | true | 如果设置为false,则不输出insert语句到日志 | 1.2alpha1 |
log4jdbc.dump.sql.update | true | 如果设置为false,则不输出update语句到日志 | 1.2alpha1 |
log4jdbc.dump.sql.delete | true | 如果设置为false,则不输出delete语句到日志 | 1.2alpha1 |
log4jdbc.dump.sql.create | true | 如果设置为false,则不输出create语句到日志 | 1.2alpha1 |
log4jdbc.dump.sql.addsemicolon | false | 是否自动在SQL语句后面加分号; | 1.2alpha1 |
log4jdbc.trim.sql | true | 是否清除SQL头尾的空白符 | 1.2beta2 |
log4jdbc.trim.sql.extrablanklines | true | 是否包含多余的空白行 | 1.2 |
我针对1.2版本(1.2-ext-3),进行了一些简单的扩展,其特性如下:
- 支持基于Hibernate或者sqlinform的SQL语句格式化,增强可读性
- 支持stacktracefilterincludes、stacktracefilterexcludes等log4jdbc.properties配置项,以便从调用栈里包含、清除包含某些字符的行,防止各种字节码框架生成的类干扰调试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
log4jdbc.dump.sql.select=true log4jdbc.dump.sql.insert=true log4jdbc.dump.sql.update=true log4jdbc.dump.sql.delete=true log4jdbc.dump.sql.create=true #是否格式化SQL语句 log4jdbc.dump.formatsql=true #是否显示完整的调用堆栈 log4jdbc.dump.fulldebugstacktrace=true #仅包含commons或者demo的调用栈的行,才会被记录 log4jdbc.dump.stacktracefilterincludes=commons,demo #包含$、_的调用栈的行,一定被排除,即使符合stacktracefilterincludes log4jdbc.dump.stacktracefilterexcludes=$,_ |
1.2-ext-3版本的SVN地址为:svn://svn.gmem.cc/log4jdbc3/trunk 它需要一个依赖包:
1 2 3 4 5 6 |
<dependency> <groupId>com.sqlinform</groupId> <artifactId>sqlinform</artifactId> <version>0.0.1</version> <optional>true</optional> </dependency> |
该包可以从这里下载:sqlinform-0.0.1
2013年初雪 →
Leave a Reply