【问题标题】:Spring JDBC is not logging SQL with log4jSpring JDBC 没有使用 log4j 记录 SQL
【发布时间】:2010-12-20 00:27:32
【问题描述】:

我正在研究弹簧,以便可能切换到弹簧堆栈。我认为很酷的一件事是 spring jdbc 能够记录所有已执行的 sql。于是我把log4j放进去,建立了一个log4j.properties文件。而且没有sql。

这里是 log4j.properties 文件:

log4j.appender.stdout=org.apache.log4j.ConsoleAppe nder
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.Patt ernLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug, stdout
log4j.category.org.springframework.jdbc.core=DEBUG

这里是一些非常简单的通过 spring jdbc 插入 sql 的输出:http://pastie.org/713189

【问题讨论】:

  • 你重启服务器了吗?阈值设置了吗?
  • 嗨 phil ... 你是怎么解决这个问题的?

标签: java spring jdbc log4j


【解决方案1】:

尝试设置这些额外的log4j 记录器。第一个会吐出通过spring的JdbcTemplate的SQL,第二个给你Spring在prepared statements上设置的参数值。

<logger name="org.springframework.jdbc.core.JdbcTemplate">
  <level value="debug" />
</logger>

<logger name="org.springframework.jdbc.core.StatementCreatorUtils">
  <level value="debug" />
</logger>

显然,这只有在您使用JdbcTemplate 直接或间接执行 SQL 时才有效。

【讨论】:

  • 第二个jdbctemplate PreparedStatementSetter中不给值
  • 就用这个就行了:log4j.logger.org.springframework.jdbc.core.JdbcTemplate=TRACE
【解决方案2】:

您确定这是您的应用程序正在接收的log4.properties 吗?我将您发布的log4j.properties 复制到我本地计算机上的 Spring 应用程序中,除了 JDBC 日志记录之外,我还获得了大量 Spring 调试条目。我在您的输出中没有看到类似的调试条目。

log4j.properties 没有被正确读取的几个可能的罪魁祸首是:

  • log4j.properties 不在您的类路径中。您可以尝试在其上执行 class.getResource() 以查看它是否能找到它。
  • 在您的类路径中还有另一个 log4j.properties
  • 某事使 commons-logging 选择使用不同的记录器。您可以找到有关打开公共日志记录诊断的说明here

【讨论】:

    【解决方案3】:

    试试

    log4j.category.org.springframework.jdbc.core = TRACE
    

    这对我有帮助,DEBUG 还不够。我正在使用 org.springframework.jdbc-3.0.6.RELEASE.jar 和 log4j-1.2.15 和 slf4j (1.6.4)

    对于一个 SQL(即,如果您对绑定参数值不感兴趣)DEBUG 就足够了。

    【讨论】:

      【解决方案4】:

      据我了解,当您使用准备好的语句时,spring 会打印出信息。

      请参阅 Spring 论坛上的 this discussion

      【讨论】:

        【解决方案5】:

        你是如何执行 SQL 的? Spring 不会神奇地记录发送到数据库的 SQL,您必须通过适当的渠道。

        例如,如果您使用JdbcTemplate 直接或通过JdbcDaoSupport 执行SQL,那么是的,将记录某些操作的SQL,但只记录那些涉及直接SQL 的操作。

        如果您使用 Hibernate 或准备好的语句,那么 Spring 永远不会看到 SQL 本身,因此无法记录它。

        如果您发布了一些示例代码来演示您是如何执行 SQL 的,那将会很有帮助。

        【讨论】:

        • 我正在使用 Spring 的 JdbcTemplate。我实际上正在使用一些受版权保护的示例代码(来自 Enterprise Spring Recicpes),所以不要认为我应该发布它。不过,我会尝试编写自己的示例,这是我的下一步。
        【解决方案6】:

        假设 Spring 3.0.7.RELEASE 和 log4j 1.2.17,我们通过以下方式完成了任务:

         <!-- activates query logging -->
         <category name="org.springframework.jdbc.core.JdbcTemplate">
            <level value="DEBUG"/>
         </category>
        <!-- activates parameter substitution logging -->
        <category name="org.springframework.jdbc.core.StatementCreatorUtils">
            <level value="TRACE"/>
        </category>
        

        ..在我们的 log4j.xml 中。

        &lt;logger/&gt; 替换&lt;category/&gt; 也可以。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多