Spring Boot에서 SQL 문을 기록하는 방법은 무엇입니까?


342

파일에 SQL 문을 기록하고 싶습니다.
나는 다음과 같은 속성을 가지고 있습니다application.properties

spring.datasource.url=...
spring.datasource.username=user
spring.datasource.password=1234
spring.datasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

security.ignored=true
security.basic.enabled=false

logging.level.org.springframework.web=INFO
logging.level.org.hibernate=INFO
logging.file=c:/temp/my-log/app.log

응용 프로그램을 실행할 때

cmd>mvn spring-boot:run

콘솔에서 sql 문을 볼 수 있지만 app.log 파일에는 표시되지 않습니다. 이 파일에는 스프링의 기본 로그 만 포함되어 있습니다.

로그 파일에서 sql 문을 보려면 어떻게해야합니까?

답변:


458

속성 파일에서 이것을 사용해보십시오 :

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

74
값을 기록하려면 :logging.level.org.hibernate.type=TRACE
elysch

2
그러나 이것은 바인드 값을 거의 기록하지 않습니다. 기준 API의 값을 어떻게 기록합니까? 사양을 사용하면 CriteriaBuilder로 작성된 바운드 매개 변수에 대한 출력이 없습니다.
Josh

204

이것은 stdout에서도 작동합니다.

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true

값을 기록하려면

logging.level.org.hibernate.type=trace

에 이것을 추가하십시오 application.properties.


11
값을 기록하려면 :spring.jpa.properties.hibernate.type=trace
elysch

1
이것은 로그 파일에 쓰지 않고 STDOUT에 씁니다
Muhammad Hewedy

4
?매개 변수 대신 여전히 봅니다 . 그 해결책이 저에게 보여 주어야합니까?
Adeynack

1
spring.jpa.properties.hibernate.type = 추적 내 로그 파일에 영향을주지 않습니다 (
gstackoverflow

1
"type = trace"는 스프링 특성이 아니므로 작동하지 않습니다. stackoverflow.com/a/41594913/5107365 아래에 제시된 솔루션 이 적합합니다.
Raj

97

이것은 나를 위해 작동합니다 (YAML).

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
logging:
  level:
    org:
      hibernate:
        type: trace

18

사용하십시오:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
spring.jpa.show-sql=true

4
logging.level.org.hibernate.SQL=DEBUG그것은 나를 위해 일하고 다른 대답을 위해 누락되었습니다. 감사!
Vic

18

logback-spring.xml 또는 이와 유사한 것을 가지고 있다면 다음 코드를 추가하십시오

<logger name="org.hibernate.SQL" level="trace" additivity="false">
    <appender-ref ref="file" />
</logger>

나를 위해 작동합니다.

바인드 변수도 가져 오려면 다음을 수행하십시오.

<logger name="org.hibernate.type.descriptor.sql" level="trace">
    <appender-ref ref="file" />
</logger>

1
Spring Boot를 사용하면<appender-ref ref="FILE" />
Ortomala Lokni

appender ref는 로그 백 xml에 정의한 appender의 이름입니다. 변수 일뿐입니다
Raja Anbazhagan

17

이것은 매우 일반적인 질문 이므로이 답변을 기반으로하는이 기사를 작성 했습니다.

피해야 할 설정

이 설정을 사용하지 않아야합니다.

spring.jpa.show-sql=true 

문제 show-sql는 콘솔에 SQL 문이 인쇄되므로 일반적으로 로깅 프레임 워크에서와 같이 필터링 할 수있는 방법이 없습니다.

최대 절전 모드 로깅 사용

로그 구성 파일에서 다음 로거를 추가하면

<logger name="org.hibernate.SQL" level="debug"/>

그런 다음, Hibernate는 JDBC PreparedStatement가 작성 될 때 SQL 문을 인쇄합니다 . 이것이 매개 변수 자리 표시자를 사용하여 명령문이 기록되는 이유입니다.

INSERT INTO post (title, version, id) VALUES (?, ?, ?)

바인드 매개 변수 값을 로그하려면 다음 로거도 추가하십시오.

<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>

BasicBinder로거 를 설정하면 바인드 매개 변수 값도 기록됩니다.

DEBUG [main]: o.h.SQL - insert into post (title, version, id) values (?, ?, ?)
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [1] as [VARCHAR] - [High-Performance Java Persistence, part 1]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [2] as [INTEGER] - [0]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [3] as [BIGINT] - [1]

datasource-proxy 사용

데이터 소스 프록시는 프록시 실제 JDBC로 할 수 있습니다 DataSource다음 다이어그램에 의해 도시 된 바와 같이 :

데이터 소스 프록시

dataSourceHibernate에 의해 사용될 bean을 다음과 같이 정의 할 수있다 :

@Bean
public DataSource dataSource(DataSource actualDataSource) {
    SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
    loggingListener.setQueryLogEntryCreator(new InlineQueryLogEntryCreator());
    return ProxyDataSourceBuilder
        .create(actualDataSource)
        .name(DATA_SOURCE_PROXY_NAME)
        .listener(loggingListener)
        .build();
}

는 것을 알 수 actualDataSource되어야 DataSource의해 정의 된 연결 풀 응용 프로그램에서 사용하고 있습니다.

을 활성화 datasource-proxy하면 SQl 문이 다음과 같이 기록됩니다.

Name:DATA_SOURCE_PROXY, Time:6, Success:True,
Type:Prepared, Batch:True, QuerySize:1, BatchSize:3,
Query:["insert into post (title, version, id) values (?, ?, ?)"],
Params:[(Post no. 0, 0, 0), (Post no. 1, 0, 1), (Post no. 2, 0, 2)]

11

MS-SQL 서버 드라이버 (Microsoft SQL Server JDBC 드라이버)

사용해보십시오 :

logging.level.com.microsoft.sqlserver.jdbc=debug

application.properties 파일에서.

내 개인적인 취향은 다음을 설정하는 것입니다.

logging.level.com.microsoft.sqlserver.jdbc=info
logging.level.com.microsoft.sqlserver.jdbc.internals=debug

다음 링크를 참조하십시오.


8

설명서 에 따르면 다음과 같습니다.

spring.jpa.show-sql=true # Enable logging of SQL statements.

나는 역 문제, 이것을 false로 설정하고, org.hibernate를 ERROR 레벨로 설정하고 여전히 인쇄 드롭 / 생성 / 삽입 / 선택
Kalpesh Soni

5

YAML에 대한 번역 된 답변 답변

logging:
  level:
    org:
      hibernate:
        SQL:
          TRACE
        type:
          descriptor:
            sql:
              BasicBinder:
                TRACE

3
다음과 같이 일회용 소품에 중첩하지 않으려는 경우 YAML에서 플랫 속성을 사용할 수도 있습니다. logging.level.org.hibernate.SQL: TRACE logging.level.org.hibernate.type.descriptor.sql.BasicBinder: TRACE
MarcinJ

4

application.properties 파일 에서 다음 중 하나를 사용할 수 있습니다 .

spring.jpa.show-sql=true 

example :
//Hibernate: select country0_.id as id1_0_, country0_.name as name2_0_ from country country0_

또는

logging.level.org.hibernate.SQL=debug 

example :
2018-11-23 12:28:02.990 DEBUG 12972 --- [nio-8086-exec-2] org.hibernate.SQL   : select country0_.id as id1_0_, country0_.name as name2_0_ from country country0_

3

쿼리에 사용 된 실제 매개 변수를 보려면

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql=TRACE

그런 다음 실제 매개 변수 값이 다음과 같이 표시됩니다. binding parameter......

   2018-08-07 14:14:36.079 DEBUG 44804 --- [           main] org.hibernate.SQL                        : select employee0_.id as id1_0_, employee0_.department as departme2_0_, employee0_.joining_date as joining_3_0_, employee0_.name as name4_0_ from employee employee0_ where employee0_.joining_date=?
    2018-08-07 14:14:36.079 TRACE 44804 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [TIMESTAMP] - [Tue Aug 07 00:00:00 SGT 2018]

3

표준 출력에 로그인

추가 application.properties

### to enable
spring.jpa.show-sql=true
### to make the printing SQL beautify
spring.jpa.properties.hibernate.format_sql=true

준비된 명령문의 매개 변수를 로그하지는 않지만 SQL 조회를 인쇄하는 가장 간단한 방법입니다. 그리고 최적화 된 로깅 프레임 워크와 같지 않기 때문에 권장되지 않습니다.

로깅 프레임 워크 사용

추가 application.properties

### logs the SQL queries
logging.level.org.hibernate.SQL=DEBUG
### logs the prepared statement parameters
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
### to make the printing SQL beautify
spring.jpa.properties.hibernate.format_sql=true

위의 속성을 지정하면 로그 항목이 log-back 또는 log4j와 같은 구성된 로그 어 펜더로 전송됩니다.


0

이 설정에 문제가 있고 다른 시간이 아닌 때때로 작동하는 것 같습니다. 작동하지 않는 시간이 단위 테스트 중인지 고려하십시오.

많은 사람들이 @TestPropertySources테스트 상속 계층에서 어딘가에 선언 된 주석을 통해 사용자 정의 테스트 시간 속성을 선언합니다. 이렇게하면 application.properties설정 한 값이 테스트시 효과적으로 무시되므로 사용자 또는 다른 프로덕션 속성 설정에 넣은 모든 내용 이 무시됩니다.


0

spring.jpa.properties.hibernate.show_sql=trueapplication.properties를 넣는 것이 항상 도움이되지는 않았습니다.

properties.put("hibernate.show_sql", "true");데이터베이스 구성의 특성에 추가 할 수 있습니다 .

public class DbConfig {

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean
    entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("dataSource") DataSource dataSource
    ) {
        Map<String, Object> properties = new HashMap();
        properties.put("hibernate.hbm2ddl.auto", "validate");
        properties.put("hibernate.show_sql", "true");

        return builder
                .dataSource(dataSource)
                .packages("com.test.dbsource.domain")
                .persistenceUnit("dbsource").properties(properties)
                .build();
    }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.