76

我正在学习 JdbcTemplate 和 NamedParameterJdbcTemplate 的奇妙之处。我喜欢我所看到的,但是有什么简单的方法可以查看它最终执行的底层 SQL 吗?我希望看到这个用于调试目的(例如为了在外部工具中调试生成的 SQL)。

4

8 回答 8

63

Spring 文档说它们是在 DEBUG 级别记录的:

该类发出的所有 SQL 都记录在与模板实例的完全限定类名对应的类别下的DEBUG级别(通常为 JdbcTemplate,但如果您使用的是 JdbcTemplate 类的自定义子类,则可能会有所不同)。

在 XML 术语中,您需要配置记录器,例如:

<category name="org.springframework.jdbc.core.JdbcTemplate">
    <priority value="debug" />
</category>

然而,这个主题是一个月前在这里讨论过的,它似乎不像在 Hibernate 中那么容易开始工作和/或它没有返回预期的信息:Spring JDBC is not logging SQL with log4j this topic under eachSuggested to use P6Spy根据这篇文章,它也可以集成到 Spring中。

于 2009-12-20T19:05:19.460 回答
43

这对我来说适用于 org.springframework.jdbc-3.0.6.RELEASE.jar。我在 Spring 文档中的任何地方都找不到这个(也许我只是懒惰),但我发现(反复试验)TRACE 级别有魔力。

我正在使用 log4j-1.2.15 以及 slf4j (1.6.4) 和属性文件来配置 log4j:

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

这将显示 SQL 语句和绑定参数,如下所示:

Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME]
Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown
Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown
Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown

不确定 SQL 类型未知,但我想我们可以在这里忽略它

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

于 2013-03-20T09:49:17.210 回答
22

我将此行用于 Spring Boot 应用程序:

logging.level.org.springframework.jdbc.core = TRACE

这种方法非常普遍,我通常将它用于我的应用程序中的任何其他类。

于 2018-10-25T21:33:35.330 回答
9

参数值似乎打印在 TRACE 级别。这对我有用:

log4j.logger.org.springframework.jdbc.core.JdbcTemplate=DEBUG, file
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file

控制台输出:

02:40:56,519 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 1, parameter value [Tue May 31 14:00:00 CEST 2005], value class [java.util.Date], SQL type unknown
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 2, parameter value [61], value class [java.lang.Integer], SQL type unknown
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 3, parameter value [80], value class [java.lang.Integer], SQL type unknown
于 2014-01-05T01:44:36.097 回答
3

这对我有用 log4j2 和 xml 参数:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
    <Properties>
        <Property name="log-path">/some_path/logs/</Property>
        <Property name="app-id">my_app</Property>
    </Properties>

    <Appenders>
        <RollingFile name="file-log" fileName="${log-path}/${app-id}.log"
            filePattern="${log-path}/${app-id}-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>

        <Logger name="org.springframework.jdbc.core" level="trace" additivity="false">
            <appender-ref ref="file-log" />
            <appender-ref ref="console" />
        </Logger>

        <Root level="info" additivity="false">
            <appender-ref ref="file-log" />
            <appender-ref ref="console" />
        </Root>
    </Loggers>

</Configuration>

结果控制台和文件日志是:

JdbcTemplate - Executing prepared SQL query
JdbcTemplate - Executing prepared SQL statement [select a, b from c where id = ? ]
StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [my_id], value class [java.lang.String], SQL type unknown

只需复制/过去

高温高压

于 2017-03-22T16:40:22.200 回答
1

尝试添加 log4j.xml

<!--  enable query logging -->
<category name="org.springframework.jdbc.core.JdbcTemplate">
    <priority value="DEBUG" />
</category>

<!-- enable query logging for SQL statement parameter value -->
<category name="org.springframework.jdbc.core.StatementCreatorUtils">
    <priority value="TRACE" />
</category>

您的日志如下所示:

DEBUG JdbcTemplate:682 - Executing prepared SQL query
DEBUG JdbcTemplate:616 - Executing prepared SQL statement [your sql query]
TRACE StatementCreatorUtils:228 - Setting SQL statement parameter value: column index 1, parameter value [param], value class [java.lang.String], SQL type unknown
于 2018-06-20T12:50:18.153 回答
0

我不是 100% 确定你得到了什么,因为通常你会将你的 SQL 查询(参数化或非参数化)传递给 JdbcTemplate,在这种情况下你只需记录这些。如果您有PreparedStatements 并且您不知道正在执行哪一个,则该toString方法应该可以正常工作。但是,当我们讨论这个主题时,这里有一个不错的 Jdbc 记录器包它可以让您自动记录您的查询以及每次查看绑定的参数。很有用。输出看起来像这样:

executing PreparedStatement: 'insert into ECAL_USER_APPT
(appt_id, user_id, accepted, scheduler, id) values (?, ?, ?, ?, null)'
     with bind parameters: {1=25, 2=49, 3=1, 4=1} 
于 2009-12-19T07:24:43.797 回答
0

无需任何 xml 或 yml 配置即可做到这一点,但就像纯 java 代码一样简单,如下所示:

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;

Logger logger = (Logger) LoggerFactory.getLogger("org.springframework.jdbc.core.JdbcTemplate");
logger.setLevel(Level.valueOf("DEBUG"));

// Or ,for more datasource details,you can retrieve another logger  like this 
// Logger logger2 = (Logger) LoggerFactory.getLogger("org.springframework.jdbc");
//logger2.setLevel(Level.valueOf("DEBUG"));

享受吧,伙计们,从这里查看更多信息https://www.bswen.com/2019/05/springboot-How-to-print-JPA-and-jdbcTemplate-SQL-logs.html

于 2021-12-28T12:05:39.453 回答