IT TIP

Spring JdbcTemplate에서 기본 SQL을보고 있습니까?

itqueen 2021. 1. 7. 20:13
반응형

Spring JdbcTemplate에서 기본 SQL을보고 있습니까?


JdbcTemplate 및 NamedParameterJdbcTemplate의 경이로움에 대해 배우고 있습니다. 내가 보는 것을 좋아하지만 실행되는 기본 SQL을 쉽게 볼 수있는 방법이 있습니까? (예를 들어 외부 도구에서 결과 SQL을 디버그하기 위해) 디버그 목적으로 이것을보고 싶습니다.


봄 문서는 그들이 DEBUG 수준에서 로그인 한 말한다 :

이 클래스에서 발행 한 모든 SQL 은 템플릿 인스턴스의 정규화 된 클래스 이름해당 하는 범주 아래 DEBUG 수준에서 기록됩니다 (일반적으로 JdbcTemplate이지만 JdbcTemplate 클래스의 사용자 정의 하위 클래스를 사용하는 경우 다를 수 있음).

XML 용어로 다음과 같이 로거를 구성해야합니다.

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

그러나이 주제는 한 달 전에 여기에서 논의되었으며 Hibernate 에서처럼 작업하기가 쉽지 않거나 예상 정보를 반환하지 않은 것 같습니다. Spring JDBC는 log4j로 SQL을 로깅하지 않습니다. 이 주제는 P6Spy 를 사용하도록 제안합니다. 이것은 또한 이 기사 에 따라 Spring에 통합 될 수있다 .


이것은 org.springframework.jdbc-3.0.6.RELEASE.jar에서 나를 위해 작동합니다. 나는 Spring 문서의 어느 곳에서도 이것을 찾을 수 없었지만 (아마도 게으르다) TRACE 레벨이 마술을했다고 (시행 및 오류) 발견했습니다.

log4j를 구성하기 위해 slf4j (1.6.4) 및 속성 파일과 함께 log4j-1.2.15를 사용하고 있습니다.

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충분해야합니다.


매개 변수 값은 TRACE 레벨에서 인쇄되는 것 같습니다. 이것은 나를 위해 일했습니다.

log4j.logger.org.springframework.jdbc.core.JdbcTem plate=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

이것은 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

복사 / 붙여 넣기

HTH


Spring Boot 애플리케이션에이 줄을 사용합니다.

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

이 접근 방식은 매우 보편적이며 일반적으로 응용 프로그램 내의 다른 클래스에 사용합니다.


I'm not 100% sure what you're getting at since usually you will pass in your SQL queries (parameterized or not) to the JdbcTemplate, in which case you would just log those. If you have PreparedStatements and you don't know which one is being executed, the toString method should work fine. But while we're on the subject, there's a nice Jdbc logger package here which will let you automatically log your queries as well as see the bound parameters each time. Very useful. The output looks something like this:

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} 

Try adding in 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>

your logs looks like:

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

ReferenceURL : https://stackoverflow.com/questions/1932208/seeing-the-underlying-sql-in-the-spring-jdbctemplate

반응형