Wie kann ich SQL-Anweisungen in Spring Boot protokollieren?

Lesezeit: 5 Minuten

Benutzer-Avatar
Oleg Pawliw

Ich möchte SQL-Anweisungen in einer Datei protokollieren.

Ich habe die folgenden Eigenschaften in 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

Wenn ich meine Anwendung ausführe,

cmd> mvn spring-boot:run

Ich kann SQL-Anweisungen in der Konsole sehen, aber sie erscheinen nicht in einer Datei, app.log. Die Datei enthält nur grundlegende Protokolle von Spring.

Was muss ich tun, um SQL-Anweisungen in der Protokolldatei anzuzeigen?

Benutzer-Avatar
Paul Woods

Versuchen Sie, dies in Ihrer Eigenschaftendatei zu verwenden:

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

  • Wenn Sie auch Werte protokollieren möchten: logging.level.org.hibernate.type=TRACE

    – elysch

    11. Juni 2016 um 0:48 Uhr

  • Dies protokolliert jedoch nur wenige Bindungswerte. Wie kann ich Werte aus der Kriterien-API protokollieren? Wenn ich Spezifikationen verwende, erhalte ich keine Ausgabe für gebundene Parameter, die mit dem CriteriaBuilder erstellt wurden.

    – Josch

    10. August 2016 um 5:48 Uhr

  • Was ist mit Leuten, die verwenden EclipseLink Anstatt von Hibernate ?

    – zahlen

    26. Oktober 2021 um 21:12 Uhr

Benutzer-Avatar
v.ladynev

Dies funktioniert auch für die Standardausgabe:

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true

So protokollieren Sie Werte:

logging.level.org.hibernate.type=trace

Fügen Sie dies einfach hinzu application.properties.

  • Wenn Sie auch Werte protokollieren möchten: spring.jpa.properties.hibernate.type=trace

    – elysch

    11. Juni 2016 um 0:48 Uhr

  • Dies schreibt nicht in die Protokolldatei, sondern in STDOUT

    – Muhammad Hewedy

    29. Juni 2016 um 8:34 Uhr

  • Ich sehe nur noch ? Anstelle der Parameter. Sollte diese Lösung sie mir zeigen?

    – Adynack

    2. Februar 2018 um 8:54 Uhr

  • spring.jpa.properties.hibernate.type=Trace wirkt sich nicht auf meine Protokolldatei aus ;(

    – gstackoverflow

    4. September 2018 um 16:54 Uhr

  • Das “type=trace” ist keine Federeigenschaft, daher funktioniert es nicht. Die unten angegebene Lösung stackoverflow.com/a/41594913/5107365 ist dafür die richtige.

    – Raj

    6. Februar 2020 um 1:00 Uhr

Benutzer-Avatar
Michel

Das funktioniert bei mir (YAML):

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

  • Das dachte ich immer show_sql: true gehört jpa

    – ka3ak

    13. Januar um 9:12

Benutzer-Avatar
Vlad Mihalcea

Zu vermeidende Einstellungen

Diese Einstellung sollten Sie nicht verwenden:

spring.jpa.show-sql=true 

Das Problem mit show-sql ist, dass die SQL-Anweisungen in der Konsole ausgegeben werden, sodass es keine Möglichkeit gibt, sie zu filtern, wie Sie es normalerweise mit einem Logging-Framework tun würden.

Hibernate-Protokollierung verwenden

In Ihrer Protokollkonfigurationsdatei, wenn Sie den folgenden Logger hinzufügen:

<logger name="org.hibernate.SQL" level="debug"/>

Dann druckt Hibernate die SQL-Anweisungen, wenn JDBC PreparedStatement geschaffen. Aus diesem Grund wird die Anweisung mit Parameterplatzhaltern protokolliert:

INSERT INTO post (title, version, id) VALUES (?, ?, ?)

Wenn Sie die Bindungsparameterwerte protokollieren möchten, fügen Sie einfach auch den folgenden Logger hinzu:

<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>

Sobald Sie die eingestellt haben BasicBinder logger, 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

Das Datenquellen-Proxy Das OSS-Framework ermöglicht es Ihnen, das eigentliche JDBC zu proxieren DataSourcewie das folgende Diagramm zeigt:

DataSource-Proxy

Sie können die definieren dataSource Bean, die von Hibernate wie folgt verwendet wird:

@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 actualDataSource muss das sein DataSource definiert durch die [connection pool][2] Sie in Ihrer Anwendung verwenden.

Als nächstes müssen Sie die einstellen net.ttddyy.dsproxy.listener Protokollebene zu debug in Ihrer Protokollierungs-Framework-Konfigurationsdatei. Wenn Sie beispielsweise Logback verwenden, können Sie den folgenden Logger hinzufügen:

<logger name="net.ttddyy.dsproxy.listener" level="debug"/>

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

Benutzer-Avatar
rahulnikhare

Bitte verwende:

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

  • logging.level.org.hibernate.SQL=DEBUG hat es für mich funktioniert und fehlte für andere Antworten. Vielen Dank!

    – Vic

    27. März 2019 um 16:58 Uhr

Benutzer-Avatar
Peter Mortensen

Wenn Sie eine haben logback-spring.xml Datei oder so ähnlich, fügen Sie den folgenden Code hinzu:

<logger name="org.hibernate.SQL" level="trace" additivity="false">
    <appender-ref ref="file" />
</logger>

Das ist für mich in Ordnung.

So erhalten Sie auch Bind-Variablen:

<logger name="org.hibernate.type.descriptor.sql" level="trace">
    <appender-ref ref="file" />
</logger>

  • logging.level.org.hibernate.SQL=DEBUG hat es für mich funktioniert und fehlte für andere Antworten. Vielen Dank!

    – Vic

    27. März 2019 um 16:58 Uhr

Benutzer-Avatar
Peter Mortensen

Für die SQL Server Treiber (Microsoft SQL Server JDBC Treiber), versuchen Sie es mit:

logging.level.com.microsoft.sqlserver.jdbc=debug

in Ihrer Datei application.properties.

Meine persönliche Präferenz ist die Einstellung:

logging.level.com.microsoft.sqlserver.jdbc=info
logging.level.com.microsoft.sqlserver.jdbc.internals=debug

Sie können sich diese Links als Referenz ansehen:

1016270cookie-checkWie kann ich SQL-Anweisungen in Spring Boot protokollieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy