我在Webapp中将jdbcdslog与log4j日志记录引擎一起使用。我能够记录执行的SQL查询。我想知道如何获取触发查询的程序包的名称。这样我就可以分离出Log信息,并通过查看日志而不是遍历代码来知道查询凸轮的位置。
我试图用%C参数的Log4j的的PatternLayout拿到包名提到这里
但是我得到的输出是
2013-07-30-main--INFO -org.jdbcdslog.StatementLogger:java.sql.Statement.executeQuery: SELECT id, first, last, age FROM Employees;
如您所见,SQL查询已记录下来,但是它给出的类是org.jdbcdslog.StatementLogger。这不是所需要的,因为我想要从中触发查询的类的名称。
我在Log4j.properties文件中使用以下设置
log4j.appender.S.layout.ConversionPattern=%d{yyyy-MM-dd}-%t-%x-%-5p-%C:%m%n
发生这种情况是因为jdbcdslog将连接包装到JDBC驱动程序。我想知道如何获取触发查询的类的名称。
在http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html中,我看不到可以为原始方法指定变量的任何地方。同样查看log4j传递的事件看起来也不像是沿着事件链传递信息。(http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/LoggingEvent.html)。
但是,如果您确实需要此功能,则可以采用一些解决方法,包括实现自己的DataSourceProxyBase。我从其下载页面下载了jdbcdslog源,看起来您可以扩展和覆盖DataSourceProxyBase类中的某些方法,并添加自己的记录器。然后指向您的设置以使用该数据源代理。
<bean id="dataSourceActual" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/MyDatasource</value> </property> </bean> <bean id="dataSource" class="com.me.MySoureConnectionPoolDataSourceProxy"> <property name="targetDSDirect" ref="dataSourceActual" /> </bean>
如果下载了源代码,则可以开始遵循他们的程序,并查看要实现所需的内容而需要覆盖的内容。一个好的起点可能是类PooledConnectionLoggingProxy