Da dies eine sehr häufige Frage ist, habe ich
diesen Artikel geschrieben , auf dem diese Antwort basiert.
Zu vermeidende Einstellungen
Sie sollten diese Einstellung nicht verwenden:
spring.jpa.show-sql=true
Das Problem dabei show-sqlist, dass die SQL-Anweisungen in der Konsole gedruckt werden, sodass es keine Möglichkeit gibt, sie zu filtern, wie Sie es normalerweise mit einem Protokollierungsframework tun würden.
Verwenden der Protokollierung im Ruhezustand
Wenn Sie in Ihrer Protokollkonfigurationsdatei den folgenden Protokollierer hinzufügen:
<logger name="org.hibernate.SQL" level="debug"/>
Anschließend druckt Hibernate die SQL-Anweisungen, wenn der JDBC PreparedStatementerstellt wird. Aus diesem Grund wird die Anweisung mithilfe von Parameterplatzhaltern protokolliert:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Wenn Sie die Bindungsparameterwerte protokollieren möchten, fügen Sie einfach den folgenden Logger hinzu:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Sobald Sie den BasicBinderLogger eingestellt haben, sehen Sie, dass auch die Bindungsparameterwerte protokolliert werden:
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]
Datenquellen-Proxy verwenden
Mit dem Datenquellen-Proxy können Sie den tatsächlichen JDBC DataSourceals Proxy verwenden , wie in der folgenden Abbildung dargestellt:

Sie können die dataSourceBean, die von Hibernate verwendet wird, wie folgt definieren:
@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();
}
Beachten Sie, dass die actualDataSourcemuss die werden DataSourcedurch die definierte Verbindungspool Sie sind in Ihrer Anwendung verwenden.
Nach dem Aktivieren datasource-proxywird die SQl-Anweisung wie folgt protokolliert:
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