获取从中触发SQL查询的包的名称?

时间:2013-07-30 18:39:09

标签: java sql logging jdbc log4j

我在webapp中使用jdbcdslog和log4j日志引擎。我能够记录执行的SQL查询。 我想知道如何获取从中触发查询的包的名称。这样我就可以分离出日志信息,并通过查看日志来了解查询的位置,而不是通过代码。

我尝试使用Log4j的PatternLayout中的%C参数来获取所提到的包名here

但我得到的输出是

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驱动程序的连接。 我想知道如何获取触发查询的类的名称。

1 个答案:

答案 0 :(得分:2)

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类