2011-06-11 60 views
3

我试图在使用log4jdbc框架包含变量之后获取SQL语句。到目前为止,它捕获并打印出需要的信息,而且还我并不需要一些东西:log4jdbc PreparedStatement.toString()

11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator connectionOpened 
INFO: 1. Connection opened 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. Connection.new Connection returned 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. PreparedStatement.new PreparedStatement returned 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. Connection.prepareStatement(INSERT INTO `xxx` (`y`, `y`, `y`, `y`, `y`, `y`) VALUES (NOW(), ?, ?, ?, ?, ?, ?)) returned [email protected] 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. PreparedStatement.setInt(1, 0) returned 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. PreparedStatement.setInt(2, 2) returned 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. PreparedStatement.setLong(3, 1426656) returned 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. PreparedStatement.setLong(4, 5177344) returned 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. PreparedStatement.setInt(5, 12) returned 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator methodReturned 
INFO: 1. PreparedStatement.setInt(6, 1) returned 
2011-06-11 10:49:40,993;[email protected]; 
11.06.2011 10:49:40 net.sf.log4jdbc.Slf4jSpyLogDelegator sqlOccured 
INFO: INSERT INTO `xxx` (`y`, y`, `y`, `y`, `y`, `y`, `y`) VALUES (NOW(), 0, 2, 1426656, 5177344, 12, 1) 

如何我可以过滤条目,只显示实际的,最后,进入?

+0

你可以发布你的log4j.properties文件的内容吗? – 2011-06-11 09:02:25

+0

我包裹log4jdbc框架示例所示http://code.google.com/p/log4jdbc/wiki/FAQ和完全不 – Vilius 2011-06-11 09:04:17

回答

3

已经浏览log4jdbc的来源,我可以推断,所有的日志记录SLF4J执行,并委托给您的应用程序使用的实际记录的实现。

我不能确定在什么记录在您的环境中实际使用。这取决于你的应用服务器(我从你的评论中推断出这一点)。通常,应用程序服务器将使用log4j或java.util.logging。

你需要配置这两种记录仪,以确保只有jdbc.sqlonly记录器已启用; log4jdbc页面上提到的其他记录器必须禁用,或将其日志记录级别设置为较高值。如果log4j的是在使用中,下面的代码片段(从example log4j properties file贴在log4jdbc网站),为您记录仪配置的最相关的部分:

! Log only the SQL that is executed. 
log4j.logger.jdbc.sqlonly=DEBUG,sql 
log4j.additivity.jdbc.sqlonly=false 

必须如果正在使用java.util.logging是可以执行类似的配置变化。

+0

好吧添加任何配置,听起来很有趣,但我不knwo在哪里插入此设置。我使用logger = org.apache.log4j.Logger.getLogger(“Logger”);然后logger.log(preparedStatement.toString());那么我可以在哪里更改日志设置? – Vilius 2011-06-11 09:57:45

+0

呃,你为什么要编写代码来创建一个新的记录器并记录下这个语句?如果您依靠log4jdbc来封装连接对象,那么我想(至少这是我对查看项目源代码的印象),它也会记录所有事情。关于更改设置的主题,您需要知道应用程序服务器使用的log4.properties的位置。编辑该文件以包含新设置应该是微不足道的;可能需要重新启动。 – 2011-06-11 10:01:35

+0

@Vilius,log4jdbc使用的所有5个记录器都由库中的SpyLogDelegator类管理;您不需要创建任何其他记录器来执行日志记录。通过log4j.properties文件只启用jdbc.sqlonly记录器,将确保只记录SQL语句。 – 2011-06-11 10:07:53