これは非常に一般的な質問であるため、
この回答に基づいてこの記事を作成しました。
避けるべき設定
この設定は使用しないでください。
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
Hibernateが使用する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)]
logging.level.org.hibernate.type=TRACE