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

203

これは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 = traceがログファイルに影響を与えない;(
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は、logback xmlで定義したアペンダーの名前です。それは単なる変数です
Raja Anbazhagan '19 / 07/19

17

これは非常に一般的な質問であるため、 この回答に基づいてこの記事を作成しました。

避けるべき設定

この設定は使用しないでください。

spring.jpa.show-sql=true 

の問題 show-sqlは、SQLステートメントがコンソールに出力されるため、通常、ロギングフレームワークで行うように、それらをフィルター処理する方法がないことです。

Hibernateロギングの使用

ログ構成ファイルで、次のロガーを追加した場合:

<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次の図で示すように、:

DataSource-Proxy

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

これらのリンクを参照してください。



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.