Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

SpringBoot Data JPA SQLをログ出力する方法

Spring Data JPA を使ってデータアクセスする際に、以下のログを出力する方法を書いていきます。

  • SQL
  • SQLのバインドパラメーター
  • SELECT文の結果

バージョン

Spring Boot 3.0.x と 2.7.x では、ログ出力の設定が異なるので両方記載しています。

  • Spring Boot 3.0.1(Hibernate 6.1.6.Final)
  • Spring Boot 2.7.7(Hibernate 5.6.14.Final)

3.0.x の出力方法

Spring Boot の設定ファイルに以下の内容を追加します。

src/main/resources/application.properties

# SQLをログ出力
logging.level.org.hibernate.SQL=debug

# SQLのバインドパラメーターをログ出力
logging.level.org.hibernate.type=trace
logging.level.org.hibernate.orm.jdbc.bind=trace

# SELECT文の結果をログ出力
logging.level.org.hibernate.orm.jdbc.extract=trace

詳細は、Spring Boot が依存する Hibernate のマニュアルに記載されていました。

Logging - Hibernate ORM 6.1 User Guide

2.7.x の出力方法

Spring Boot の設定ファイルに以下の内容を追加します。

src/main/resources/application.properties

# SQLをログ出力
logging.level.org.hibernate.SQL=debug

# SQLのバインドパラメーターとSELECT文の結果をログ出力
logging.level.org.hibernate.type=trace
logging.level.org.hibernate.type.descriptor.sql=trace

詳細は Hibernate のマニュアルに記載されていました。

Logging - Hibernate ORM 5.6 User Guide

2.7.x の補足

バインドパラメーターとSELECT文の結果を分けて出力したい場合は、以下のように設定しました。

# SQLをログ出力
logging.level.org.hibernate.SQL=debug

# SQLのバインドパラメーターをログ出力
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace

# SELECT文の結果をログ出力
logging.level.org.hibernate.type.descriptor.sql.BasicExtractor=trace

※ この設定方法はマニュアルに記載されていません。

3.0.1 の動作確認

Spring Boot のアプリでログ出力を確認しました。古いバージョンのログとは、少し違う内容になっています。

... DEBUG ... org.hibernate.SQL                        : select s1_0.id,s1_0.create_time,s1_0.name,s1_0.update_time,s1_0.version from student s1_0 where s1_0.id=?
... TRACE ... org.hibernate.orm.jdbc.bind              : binding parameter [1] as [BIGINT] - [2]
... TRACE ... org.hibernate.orm.jdbc.extract           : extracted value ([1] : [BIGINT]) - [2]
... TRACE ... org.hibernate.orm.jdbc.extract           : extracted value ([2] : [TIMESTAMP]) - [2022-12-23 16:19:53.996101]
... TRACE ... org.hibernate.orm.jdbc.extract           : extracted value ([3] : [VARCHAR]) - [Jhon Smith]
... TRACE ... org.hibernate.orm.jdbc.extract           : extracted value ([4] : [TIMESTAMP]) - [2022-12-26 22:11:01.194852]
... TRACE ... org.hibernate.orm.jdbc.extract           : extracted value ([5] : [BIGINT]) - [1]

2.7.7 の動作確認

Spring Boot のアプリでログ出力を確認しました。

... DEBUG ... org.hibernate.SQL                        : select student0_.id as id1_0_0_, student0_.create_time as create_t2_0_0_, student0_.update_time as update_t3_0_0_, student0_.name as name4_0_0_, student0_.version as version5_0_0_ from student student0_ where student0_.id=?
... TRACE ... o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [2]
... TRACE ... o.h.type.descriptor.sql.BasicExtractor   : extracted value ([create_t2_0_0_] : [TIMESTAMP]) - [2022-12-23 16:19:53.996101]
... TRACE ... o.h.type.descriptor.sql.BasicExtractor   : extracted value ([update_t3_0_0_] : [TIMESTAMP]) - [2022-12-26 22:11:01.194852]
... TRACE ... o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [Jhon Smith]
... TRACE ... o.h.type.descriptor.sql.BasicExtractor   : extracted value ([version5_0_0_] : [BIGINT]) - [1]