log4jdbc日志框架介绍

https://code.google.com/p/log4jdbc/    (官方地址)

官方说明文档中讲述要更换jdbc驱动driver和链接的url,例如:
String jdbcdriver = net.sf.log4jdbc.DriverSpy
String jdbcurl = jdbc:log4jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/databases/MyDatabase

-------------------------------------------------------------------------------------

上述是官方要求的方式,下面笔者介绍一下在SpringMvc+MyBatis3.2.1中配置log4jdbc的代码:
首先需要几个关键jar包:
log4j-1.2.17.jar, log4jdbc4-1.2.jar, mybatis-3.2.1.jar, mybatis-spring-1.2.0.jar, slf4j-api-1.7.6.jar, slf4j-log4j12-1.7.6.jar



下面是关键性代码:
DataSourceSpyInterceptor.java代码如下:
package com.shihuan.interceptor;

import java.sql.Connection;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import net.sf.log4jdbc.ConnectionSpy;
import net.sf.log4jdbc.RdbmsSpecifics;
import net.sf.log4jdbc.DriverSpy;
import net.sf.log4jdbc.SpyLogFactory;

public class DataSourceSpyInterceptor implements MethodInterceptor {

	private RdbmsSpecifics rdbmsSpecifics = null;
	
	private RdbmsSpecifics getRdbmsSpecifics(Connection conn) {
		if (rdbmsSpecifics == null) {
			rdbmsSpecifics = DriverSpy.getRdbmsSpecifics(conn);
		}
		return rdbmsSpecifics;
	}
	
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		Object result = invocation.proceed();
		if (SpyLogFactory.getSpyLogDelegator().isJdbcLoggingEnabled()) {
			if (result instanceof Connection) {
				Connection conn = (Connection)result;
				return new ConnectionSpy(conn, getRdbmsSpecifics(conn));
			}
		}
		return result;
	}

}

引用


上述java代码中import net.sf.log4jdbc.RdbmsSpecifics;和
import net.sf.log4jdbc.DriverSpy;两句正常是不能被引用的,因为从官方下载的log4jdbc4-1.2.jar中RdbmsSpecifics和DriverSpy的级别不是public的,所以在外部的类中无法被引用,笔者这里是下载了官方的源代码并做了少许的更改,就是在方法前加了public,这样改动后就可以进行import了。



在applicationContext.xml文件中加入如下代码:
<bean id="log4jdbcInterceptor" class="com.shihuan.interceptor.DataSourceSpyInterceptor" />
    <bean id="dataSourceLog4jdbcAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    	<property name="interceptorNames">
    		<list>
    			<value>log4jdbcInterceptor</value>
    		</list>
    	</property>
    	<property name="beanNames">
    		<list>
    			<value>dataSource</value>
    		</list>
    	</property>
    </bean>


在web.xml中要有如下代码(Log4jConfigListener要在ContextLoaderListener之前加载):
<context-param>   
        <param-name>log4jConfigLocation</param-name>   
        <param-value>classpath:log4j.properties</param-value>   
    </context-param>
    <!--
    <context-param>  
        <param-name>log4jRefreshInterval</param-name>  
        <param-value>60000</param-value>  
    </context-param>
    -->
    <!-- 监听器,用于初始化log4j日志框架的 -->   
    <listener>   
    	<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>   
    </listener>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml,classpath:spring-mybatis.xml</param-value>
	</context-param>
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>


log4j.properties文件代码如下:
log4j.rootLogger=info,console,file
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-p [%t]: (%F:%L) - %m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=E:/logs/mybatisserver/log4j.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d\: at %l%n %-p - %m%n

#log4j.logger.com.ibatis=debug  
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug  
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug  
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
#log4j.logger.java.sql.Connection=debug
#log4j.logger.java.sql.Statement=debug
#log4j.logger.java.sql.PreparedStatement=debug

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


引用


上述做法要依赖Spring的Aop,注意这种配置不用改变原始的jdbc中url链接字符串了。



笔者最后在控制台打印的结果如下:
INFO [http-bio-8080-exec-1]: (Slf4jSpyLogDelegator.java:370) - select ID,STOCK, VALUE from stocks where ID = 9 
 {executed in 0 msec}

INFO [http-bio-8080-exec-1]: (Slf4jSpyLogDelegator.java:370) - select ID, STOCK, VALUE from stocks 
 {executed in 0 msec}

INFO [http-bio-8080-exec-1]: (Slf4jSpyLogDelegator.java:370) - insert into stocks (STOCK, VALUE) values ('我的中国2125950289', '20140501') 
 {executed in 0 msec}
INFO [http-bio-8080-exec-1]: (Slf4jSpyLogDelegator.java:370) - update stocks SET STOCK = 'jzg2125950289', VALUE = '0.7295182' where ID = 9 
 {executed in 0 msec}
INFO [http-bio-8080-exec-1]: (Slf4jSpyLogDelegator.java:370) - delete from stocks where ID = 14 
 {executed in 0 msec}

五月 01, 2014 4:36:52 下午 org.apache.jasper.compiler.TldLocationsCache tldScanJar
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
WARN [http-bio-8080-exec-1]: (MyInterceptor.java:71) - 调用方法:com.shihuan.controller.StockController.indexStockBean();  花费时间:3094 ms.返回网页:index.jsp

猜你喜欢

转载自shihuan830619.iteye.com/blog/2059107
今日推荐