badqiu

XPer
随笔 - 46, 文章 - 3, 评论 - 195, 引用 - 0
数据加载中……

log4jdbc日志框架介绍

 

现大家使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺点是占位符与参数是分开打印,如果想要拷贝sqlPLSQL Developer客户端直接执行,需要自己拼凑sql。而log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,方便直接拷贝sqlPLSQL Developer等客户端直接执行,加快调试速度。

.简单介绍:

1.没有使用log4jdbcsql显示:

 

select username,password from bitth_date > ? and age < ? and username = ?

2.使用log4jdbcsql显示:

select username,password from bitth_date > to_date(‘2010-11-11’,’yyyy-mm-dd’) and age < 20 and username = ‘qq2008’ {executed in 2 msec}


这样就可以直接拷贝上面的sqlPLSQL直接执行. 最后的 {executed in 2 msec} SQL执行时间.而如果mysql,日志信息将不会出现 to_date()

.log4jdbc使用:

1.spring xml配置(拦截需要处理的dataSource连接)

    <bean id="log4jdbcInterceptor" class="net.sf.log4jdbc.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>

2.log4j.properties配置:

 

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

 

(日志信息如果全部为off,log4jdbc将不会生效,因此对性能没有任何影响)

3.下载slf4j

log4jdbc需要依赖slf4j日志框架. http://www.slf4j.org/

三.扩展说明

DataSourceSpyInterceptor为我自己扩展的一个拦截器类,扩展主要是使用AOP的方式,因为log4jdbc原来的方式不适合我的项目.具体源码为:

 

 

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class DataSourceSpyInterceptor implements MethodInterceptor {
 
private RdbmsSpecifics rdbmsSpecifics = null;
 
    
private RdbmsSpecifics getRdbmsSpecifics(Connection conn) {
        
if(rdbmsSpecifics == null) {
            rdbmsSpecifics 
= DriverSpy.getRdbmsSpecifics(conn);
        }
        
return rdbmsSpecifics;
    }
    
 
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;
 }
}

 

四.相关下载:

 

log4jdbc: http://code.google.com/p/log4jdbc/

另外一个对log4jdbc的扩展: http://code.google.com/p/log4jdbc-remix/

 

 

posted on 2010-08-20 14:07 badqiu 阅读(5287) 评论(8)  编辑  收藏

评论

# re: log4jdbc日志框架介绍  回复  更多评论   

好东东。。。
2010-08-20 14:22 | melin

# re: log4jdbc日志框架介绍  回复  更多评论   

用p6spy也可以解决此问题
2010-08-20 16:08 | cxh8318

# re: log4jdbc日志框架介绍[未登录]  回复  更多评论   

不错的东西,刚看了。
还有cxh8318介绍的P6Spy已经是2003年到现在没有更新的东西了。
而现在都是jdbc4了
2010-08-20 16:39 | alan

# re: log4jdbc日志框架介绍  回复  更多评论   

借用hibernate sql格式化工具类,把sql格式化一把。这样可以把hibernate.show_sql设置为false。

修改Slf4jSpyLogDelegator类

out.append(sql);
out.append(" {executed in ");
out.append(execTime);
out.append(" msec}");
BasicFormatterImpl format = new BasicFormatterImpl();
return format.format(out.toString());
2010-08-20 17:05 | melin

# re: log4jdbc日志框架介绍[未登录]  回复  更多评论   

melin你太有才了,是个不错的想法。哈!!!
2010-08-20 18:14 | badqiu

# re: log4jdbc日志框架介绍  回复  更多评论   

log4jdbc 在那个地方可以修改执行的sql语句。
2010-08-22 16:51 | melin

# re: log4jdbc日志框架介绍[未登录]  回复  更多评论   

非常好的东东,实在太感谢了,哥们儿
2010-08-23 16:42 | Nicholas

# re: log4jdbc日志框架介绍[未登录]  回复  更多评论   

非常好,就是下载的时候 还差一点 就是下不来
2013-08-06 19:56 | 欧阳

只有注册用户登录后才能发表评论。


网站导航: