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

파일에 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 문을 보려면 어떻게해야합니까?



답변

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

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


답변

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


답변

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

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


답변

사용하십시오:

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


답변

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>


답변

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

피해야 할 설정

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

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)]


답변

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

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