日期:2014-05-16  浏览次数:20442 次

日志框架(三)------log4jdbc数据库访问日志框架使用

?

? ? ?log4jdbc 是工作在jdbc层的一个日志框架,能够记录SQL及数据库连接执行信息。

一般的SQL日志会把占位符和参数值分开打印,log4jdbc则会记录数据库执行的完整SQL字符串,在数据库应用开发调试阶段非常有用。

log4jdbc具有以下特性:

?

  • 支持JDBC3和JDBC4。
  • 支持现有大部分JDBC驱动。
  • 易于配置(在大部分情况下,只需要改变驱动类名并在jdbc url前加上”jdbc:log4“,设置好日志输出级别)。
  • 能够自动把SQL变量值加到SQL输出日志中,改进易读性和方便调试。
  • 能够快速标识出应用程序中执行比较慢的SQL语句。
  • 能够生成SQL连接数信息帮助识别连接池/线程问题。

1 使用log4jdbc前,首先下载相关依赖的jar文件

log4jdbc日志系统基于SLF4J('Simple Logging Facde),本例采用的依赖文件列表如下:
log4jdbc3-1.2beta2.jar (for JDBC 3 (JDK 1.4 and 1.5))
log4j-1.2.15.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-16.1.jar?

2 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日志框架介绍》参阅。


?

?

?

?

?

?

?

?

?

?

?

?