log4jdbc 是工作在jdbc层的一个日志框架,能够记录SQL及数据库连接执行信息。
一般的SQL日志会把占位符和参数值分开打印,log4jdbc则会记录数据库执行的完整SQL字符串,在数据库应用开发调试阶段非常有用。
log4jdbc具有以下特性:
log4jdbc使用很方便,而且可以根据不同的开发需要采用不同的使用方案。此处将使用方式分为两类:编程式和声明式(或配置式)
无论采用哪一种方法,都需要在日志配置文件中定义相关logger对象的输出级别和输出器。
在log4jdbc中定义了以下五个日志对象:
jdbc.sqlonly : 记录系统执行过的sql语句
jdbc.sqltiming : 记录sql执行的时间,可以分析耗时的sql语句
jdbc.audit : 记录除了ResultSet外的所有JDBC调用情况。一般不需要。
jdbc.resultset : 记录返回结果集信息
jdbc.connection: 记录数据库连接和释放信息,可记录当前的数据库连接数,便于诊断连接是否释放。
##-------------log4jdbc 配置方式示例---------------## #值设置方式 :如果关闭设置为OFF,如果开启设置为ON(默认debug级别)或(设置输出级别,输出器) log4j.logger.jdbc.sqlonly=INFO,console log4j.logger.jdbc.sqltiming=INFO,console log4j.logger.jdbc.audit=INFO,console log4j.logger.jdbc.resultset=INFO,console log4j.logger.jdbc.connection=INFO,console log4j.additivity.jdbc.sqlonly=false log4j.additivity.jdbc.sqltiming=false log4j.additivity.jdbc.audidt=false log4j.additivity.jdbc.resultset=false log4j.additivity.jdbc.connection=false log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.SimpleLayout
1,声明式
当数据库连接信息记录在配置文件(properties文件、spring 配置文件或tomcat连接池配置文件等)中,可以采用声明式配置。
只需要修改数据库驱动类和连接字符串即可,以tomcatJNDI连接池为例
原有配置:
<Resource name="jdbc/mysql" type="javax.sql.DataSource" maxActive="4" maxIdle="2" username="root" maxWait="5000" password="root" factory="org.apache.commons.dbcp.BasicDataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/gis?autoReconnect=true"/>
启用log4jdbc配置:
<Resource name="jdbc/mysql" type="javax.sql.DataSource" maxActive="4" maxIdle="2" username="root" maxWait="5000" password="root" factory="org.apache.commons.dbcp.BasicDataSourceFactory" driverClassName="net.sf.log4jdbc.DriverSpy" url="jdbc:log4jdbc:mysql://localhost:3306/gis?autoReconnect=true"/>
2,编程式
编程式使用jdbc日志有两种方法
方法一:修改代码中数据库驱动类名和连接字符串
private static String driver="net.sf.log4jdbc.DriverSpy"; //原始值//"com.mysql.jdbc.Driver";
private static String url="jdbc:log4jdbc:mysql://localhost:3306/gis"; //原始值// "jdbc:mysql://localhost:3306/gis";
方法二:包装正常的数据库连接对象Connection
public static Connection getConn() throws SQLException{ conn = ds.getConnection(); conn.setAutoCommit(true); //未配置driver和url为log4jdbc格式 return new net.sf.log4jdbc.ConnectionSpy(conn); }
此外,对于编程式中的方法二,在baidqiu的文章《log4jdbc日志框架介绍》中提供了基于spring aop的另一种可配置式使用方式。
原理是对spring中的 dataSource bean设置自动代理,对dataSource返回的connection进行拦截,使之返回如上所述的connection包装对象。
具体实现请移步《log4jdbc日志框架介绍》参阅。