- 浏览: 674473 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
qq826928141:
longxing898 写道请教:使用jtds连接sql 20 ...
rapid-framework v3.9新版本发布 -
qq826928141:
美味人间 写道大哥,这个代码生成器怎么无法获取表和列的备注信息 ...
rapid-framework v3.9新版本发布 -
walle1027:
能发一下的测试代码吗?
rabbitmq性能测试 -
在世界的中心呼喚愛:
好东西,我就是参考这个!!!
iBatis3基于方言(Dialect)的分页 -
暂不存在:
怎么将{key}中的值替换掉
rapid系列:发布一款动态构造sql的工具: XsqlBuilder
现大家使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺点是占位符与参数是分开打印的,如果想要拷贝sql至PLSQL Developer客户端直接执行,需要自己拼凑sql。而log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,方便直接拷贝sql在PLSQL Developer等客户端直接执行,加快调试速度。
一.简单介绍:
1.没有使用log4jdbc前sql显示:
select username,password from bitth_date > ? and age < ? and username = ?
2.使用log4jdbc后sql显示:
select username,password from bitth_date > to_date(‘2010-11-11’,’yyyy-mm-dd’) and age < 20 and username = ‘qq2008’ {executed in 2 msec}
这样就可以直接拷贝上面的sql在PLSQL直接执行. 最后的 {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/
评论
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(NAME10_0_) returned 企业
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(SCOPE10_0_) returned 2
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(STATUS10_0_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getTimestamp(STATUS7_10_0_) returned 2013-05-24 10:15:33.0
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(USER2_7_1_) returned 24
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(ROLE1_1_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
全是这种的,受不了
你看下官文文档吧,可以通过配置文件控制的。
我是复制文章上的配置,没有起作用
一堆堆的这东西,真烦人,按照log4j里面的配置也不起作用。
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(NAME10_0_) returned 企业
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(SCOPE10_0_) returned 2
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(STATUS10_0_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getTimestamp(STATUS7_10_0_) returned 2013-05-24 10:15:33.0
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(USER2_7_1_) returned 24
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(ROLE1_1_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
全是这种的,受不了
你看下官文文档吧,可以通过配置文件控制的。
我是复制文章上的配置,没有起作用
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(NAME10_0_) returned 企业
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(SCOPE10_0_) returned 2
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(STATUS10_0_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getTimestamp(STATUS7_10_0_) returned 2013-05-24 10:15:33.0
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(USER2_7_1_) returned 24
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(ROLE1_1_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
全是这种的,受不了
你看下官文文档吧,可以通过配置文件控制的。
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(NAME10_0_) returned 企业
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(SCOPE10_0_) returned 2
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getString(STATUS10_0_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getTimestamp(STATUS7_10_0_) returned 2013-05-24 10:15:33.0
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(USER2_7_1_) returned 24
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.wasNull() returned false
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
信息: 1. ResultSet.getInt(ROLE1_1_) returned 1
2013-6-20 12:59:38 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned
全是这种的,受不了
log4jdbc: <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"/> <property name="url" value="jdbc:log4jdbc:hsqldb:mem:test"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean> Original one: <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <property name="url" value="jdbc:hsqldb:mem:test"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean>
静待答复,谢谢!
修改Slf4jSpyLogDelegator类
out.append(sql);
out.append(" {executed in ");
out.append(execTime);
out.append(" msec}");
BasicFormatterImpl format = new BasicFormatterImpl();
return format.format(out.toString());
能否把建表语句也格式化?
sql显示应该在jdbc的driver里面配置就ok了。mysql connector就支持这个功能。
但是就是这个日志的东东会报错。
随便建一个表里面有一个varchar的字段,用框架生成一个demo,然后运行这个demo,插入或修改成一个这样的值:
a'a"就是先是单引号后是双引号的就会引起错误,异常显示java.util.NoSuchElementException;java.util.StringTokenizer。数据库使用mysql。
具体没深究是哪里引起的问题。
没事的时候看了一眼log4jdbc的源代码,发现了问题所在:
在net.sf.log4jdbc.BasicSqlFormatter.java146行
while ( !"\"".equals( t ) );
应该改为
while ( !"\"".equals( t ) && tokens.hasMoreTokens() );
这个bug可以报给log4jdbc官方: http://code.google.com/p/log4jdbc/
但是就是这个日志的东东会报错。
随便建一个表里面有一个varchar的字段,用框架生成一个demo,然后运行这个demo,插入或修改成一个这样的值:
a'a"就是先是单引号后是双引号的就会引起错误,异常显示java.util.NoSuchElementException;java.util.StringTokenizer。数据库使用mysql。
具体没深究是哪里引起的问题。
没事的时候看了一眼log4jdbc的源代码,发现了问题所在:
在net.sf.log4jdbc.BasicSqlFormatter.java146行
while ( !"\"".equals( t ) );
应该改为
while ( !"\"".equals( t ) && tokens.hasMoreTokens() );
但是就是这个日志的东东会报错。
随便建一个表里面有一个varchar的字段,用框架生成一个demo,然后运行这个demo,插入或修改成一个这样的值:
a'a"就是先是单引号后是双引号的就会引起错误,异常显示java.util.NoSuchElementException;java.util.StringTokenizer。数据库使用mysql。
具体没深究是哪里引起的问题。
修改Slf4jSpyLogDelegator类
out.append(sql);
out.append(" {executed in ");
out.append(execTime);
out.append(" msec}");
BasicFormatterImpl format = new BasicFormatterImpl();
return format.format(out.toString());
发表评论
-
java使用java heap外(堆外)内存导致的内存泄露
2012-04-26 13:09 15023java可以通过 java.nio.ByteBuffer.al ... -
Mockito测试实例
2011-05-23 21:10 9147Mockito是现在java领域中, ... -
ibatis3 (mybatis) 实例代码下载兼ibatis3优劣分析
2009-09-24 00:14 15612(本文章于2010-06-30更新以适应mybatis的最新版 ... -
[设计模式]AsyncToken模式,替换通常的Listener模式
2009-09-02 22:13 5565对于一个异步的方法调 ... -
扩展hadoop hdfs,实现WebDav协议,将hdfs mount为linux本地文件系统
2008-11-18 18:38 17101使用hadoop的shell命令进行hdfs的操作十分不方便, ... -
Hibernate通用序列化方案,避免延迟加载问题及序列化整个数据库至客户端
2008-10-29 22:18 3477在使用Ajax: Hibernate Entity => ... -
直接在Action中返回forward不好么
2008-07-08 22:03 2450如果在配置文件中写Action执行完的跳转的路径,那么在编写A ...
相关推荐
2. **slf4j-api-1.8.0-beta0.jar** 和 **slf4j-log4j12-1.8.0-beta0.jar**:Simple Logging Facade for Java (SLF4J) 是一个用于各种日志框架的抽象层,如Log4j、java.util.logging等。这两个JAR文件分别是SLF4J API...
Log4jdbc 是一个非常实用的 Java SQL 日志框架,它通过代理模式来拦截常见的 JDBC 驱动,如 Oracle、Derby、MySQL、PostgreSQL、H2、HSQLDB 等,使得开发者能够轻松地记录和分析 SQL 操作。这个框架的核心优势在于其...
在本项目中,"springmvc+mybatis+mysql+log4jdbc+excel 实现sql日志输出和excel导出",开发者旨在构建一个基于SpringMVC、MyBatis、MySQL数据库,利用Log4jdbc记录SQL日志,并通过Jxls进行Excel数据导出的功能完善的...
如果启用了JDBC日志记录(`SpyLogFactory.getSpyLogDelegator().isJdbcLoggingEnabled()`返回`true`),并且返回的结果是一个`Connection`对象,则将原始连接包装成`ConnectionSpy`对象并返回。 #### 四、Spring配置...
Log4j 是一个功能强大且广泛使用的日志记录工具,特别是在 SSM(Spring、Spring MVC、Mybatis)整合项目中,合理地配置 Log4j 对项目的日志记录和输出至关重要。本文将详细介绍 SSM 整合中的 Log4j 配置详情,帮助...
在开发和性能调优过程中,Log4jdbc能提供宝贵的数据库操作日志,帮助开发者了解数据库性能瓶颈,从而优化数据库查询。 在实际项目中,这些技术的集成通常包括以下步骤: 1. 配置SpringBoot,添加对应的依赖,如...
Log4j2是一款广泛使用的日志框架,它提供了灵活且高效的日志记录功能。本示例将详细介绍如何配置并使用Log4j2将日志信息记录到MySQL数据库中。 首先,我们要理解Log4j2的核心概念。Log4j2主要包括以下几个组件: 1...
Apache Log4j 是一个流行的 Java 日志框架,它提供了灵活的日志记录机制,并支持将日志信息存储到不同的目的地,如控制台、文件或数据库等。 本文主要介绍如何使用 Log4j 将日志信息存储到 MySQL 数据库中。通过...
在IT行业中,日志管理是系统监控和故障排查的关键环节,而Log4j作为Java领域广泛应用的日志框架,因其灵活性和高效性深受开发者喜爱。本文将深入探讨如何使用Log4j将日志信息写入数据库,以实现更高级别的日志管理和...
总结起来,本文介绍了如何结合Log4j和Ibatis来输出SQL日志。通过调整Log4j的配置,开发者可以方便地查看并理解应用程序中的数据库操作,从而提高代码的可维护性和性能。在实际开发中,合理地使用日志记录能够极大地...
在这个场景中,我们使用了SLF4J(Simple Logging Facade for Java)作为日志抽象层,它为各种日志框架提供了统一的API,而SLF4J-log4j12-1.5.0.jar和slf4j-api-1.5.0.jar正是SLF4J与Log4j之间的桥梁,使得我们可以...
关于日志,Log4j是一个广泛使用的Java日志框架,它允许开发者记录应用程序运行过程中的事件,提供不同级别的日志输出,如DEBUG、INFO、WARN、ERROR等。Log4j包含配置文件,可以设置日志级别、输出目的地(控制台、...
Log4j是Apache提供的一款强大的、灵活的日志框架,广泛应用于各种Java应用程序。本文将深入讲解如何利用Log4j将日志信息存储到数据库中。 首先,我们需要理解Log4j的基本架构。Log4j由三个主要组件构成:Logger...
Log4j是一款广泛使用的Java日志框架,它允许开发者灵活地控制日志信息的输出。这篇博客“使用log4j记录日志到数据库”将介绍如何配置和使用Log4j,以便将日志信息存储到数据库中,而非传统的文本文件。数据库存储的...
Log4j2是一款广泛使用的日志记录框架,它提供了丰富的日志处理功能和灵活的配置。JDBC Appender是Log4j2中的一个重要组件,它允许我们把日志信息存储到关系型数据库中,例如MySQL。这个配置尤其适用于需要长期保留和...
5. **Log4j**:Log4j 是一个流行的Java日志框架,提供了一种灵活的日志记录方式。通过配置,开发者可以选择不同的日志级别,控制日志输出的详细程度。在SSM+cxf框架中,Log4j用于记录系统运行时的信息,帮助调试和...
log4jdbc是一个优秀的数据库查询日志工具,而log4jdbc-1.2-forjdbi则是针对JDBI框架的特别定制版。这个版本与原版log4jdbc的主要区别在于,它从DEBUG级别的日志语句中去除了类和方法信息,这主要是因为当log4jdbc与...
3. **日志收集**:学习如何在应用程序中配置和使用日志框架(如Log4j、SLF4J等),以便记录SQL执行日志。 4. **日志解析**:理解如何从日志文件中提取SQL语句及其执行时间,这通常涉及到正则表达式或特定的日志解析...