xylz,imxylz

关注后端架构、中间件、分布式和并发编程

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  111 随笔 :: 10 文章 :: 2680 评论 :: 0 Trackbacks

最近的项目使用的是旧的ibatis2.x版本,有时候为了方便调试,想输出SQL执行的语句和参数。我记得应该有某些logger的日志级别修改为DEBUG就可以看到。当然为了方便可以直接在log4j(如果使用log4j的话)的root日志级别修改为DEBUG,并且输出appender的接受级别修改为DEBUG就可以了。这样是可以看到日志信息(SQL/参数)等,但是同时也输出了过多的其它logger信息,显然在一个稍微大一点的系统里面debug的信息应该都是非常多的,不说别的,光是spring的日志就够好多页了。

为了解决过多的日志,翻出ibatis源码,看了下。ibatis的执行流程大致是这样的。

ibatis-log

执行步骤如下:

  1. 通过SqlMapClient执行query/execute操作;
  2. 打开一个SqlMapSession会话(openSession());
  3. 设置数据源(DataSource)或者外部给的java.sql.Connection;
  4. 通过java.sql.Connection和外部给的Transaction(如果有的话)构造事务;
  5. 如果java.sql.Connection的日志级别为DEBUG,构造一个带日志记录的ConnectionLogProxy(是java.sql.Connection的一个Proxy);
  6. 在ConnectionLogProxy中构造一个带日志记录的PreparedStatementLogProxy(是java.sql.PreparedStatement的一个Proxy);
  7. 执行java.sql.Connection中的操作(如果是ConnectionLogProxy就记录连接日志);
  8. 执行java.sql.PreparedStatement操作(如果是PreparedStatementLogProxy就记录操作记录,包括SQL信息)。

我们看三段代码:

 

 

 

第一段代码可以看到,要想记录日志的前提是java.sql.Connection的logger的级别是DEBUG或者更低。

第二段代码可以看到,要想记录PreparedStatement的日志,那么比如满足上述第一段代码的条件。这里会记录连接Connection打开的相关信息,比如是否是新开的Connection,这可以从id中分析出。ConnectionLogProxy是java.sql.Connection的一个Proxy实现。

第三段代码可以看到,记录PreparedStatement的日志(SQL/参数)需要java.sql.PreparedStatement的logger的级别是DEBUG或者更低。这里会记录执行的SQL、参数、参数类型等。PreparedStatementLogProxy是java.sql.PreparedStatement的一个Proxy实现。

因此要显示执行的SQL、参数、参数类型以及连接信息等需要配置两个日志级别为DEBUG或者更低。

对于log4j来说增加以下两项就可以了(如果是properties文件的话,xml修改对应规则):

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

 

上面第二段代码中如果看的够仔细的话可以发现有一个ResultSetLogProxy的代理,配置这个相关的日志级别后可以输出执行结果信息。有兴趣的可以看看吧。



©2009-2014 IMXYLZ |求贤若渴
posted on 2010-12-05 15:17 imxylz 阅读(3486) 评论(3)  编辑  收藏 所属分类: J2EE

评论

# re: Ibatis 2.x日志记录(SQL调试)分析 2010-12-09 09:52 mashiguang
第2,3张图片重复了。  回复  更多评论
  

# re: Ibatis 2.x日志记录(SQL调试)分析 2010-12-19 10:07 xylz
@mashiguang
多谢,已经修复过来了  回复  更多评论
  

# re: Ibatis 2.x日志记录(SQL调试)分析 2014-10-23 21:16 y+
请问楼主LOG4J是什么版本?  回复  更多评论
  


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


网站导航:
 

©2009-2014 IMXYLZ