Hibernate-Tipp: Wie loggt man SQL Statements und ihre Parameter?

Neuigkeiten von der Insel  –  1 Kommentare

Die Hibernate-Tipps-Serie bietet schnelle und einfache Lösungen zu verbreiteten Hibernate-Fragen. Zum Auftakt geht es um die richtige Konfiguration zur Protokollierung der ausgeführten Datenbankabfragen und ihrer Parameter.

Frage

Wie muss ich Hibernate konfigurieren, damit es die ausgeführten SQL-Abfragen mit den verwendeten bind-Parametern protokolliert?

Lösung

Hibernate verwendet zwei unterschiedliche Kategorien und Level, um die ausgeführten SQL-Abfragen und ihre bind-Parameter zu loggen:

  • Die SQL Abfragen werden als DEBUG-Nachrichten in der Kategorie org.hibernate.SQL protokolliert.
  • Die verwendeten bind-Parameter hingegen werden in der Kategorie org.hibernate.type.descriptor.sql und dem Level TRACE in die Logdatei geschrieben.

Diese Trennung ermöglicht es, die Protokollierung der Abfragen und Parameter unabhängig voneinander zu aktivieren und somit die Logausgaben auf die aktuellen Bedürfnisse anzupassen.

Der folgende Codeschnipsel einer log4j-Beispielkonfiguration aktiviert die Logausgaben für SQL-Abfragen und ihre Parameter.

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n

log4j.rootLogger=info, stdout
# basic log level for all messages
log4j.logger.org.hibernate=info

# SQL statements and parameters
log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.type.descriptor.sql=trace

Für jede ausgeführte Datenbankabfrage schreibt Hibernate dann eine Reihe von Lognachrichten.

17:34:50,353 DEBUG [org.hibernate.SQL] - select author0_.id as id1_0_, author0_.firstName as firstNam2_0_, author0_.lastName as lastName3_0_, author0_.version as version4_0_ from Author author0_ where author0_.id=1
17:34:50,362 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([id1_0_] : [BIGINT]) - [1]
17:34:50,373 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([firstNam2_0_] : [VARCHAR]) - [Joshua]
17:34:50,373 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([lastName3_0_] : [VARCHAR]) - [Bloch]
17:34:50,374 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([version4_0_] : [INTEGER]) - [0]

Mehr zum Thema Logging

Mehr Informationen zum Thema Logging mit Hibernate und meine Empfehlungen für eine Entwicklungs- und eine Produktionskonfiguration gibt es im Artikel "HibernateLogging Guide – Use the right config for development and production".

Hibernate Tips – das Buch

Mehr als 70 solcher Rezepte zu Themen wie einfache und komplexe Mappingdefinitionen, Logging, Unterstützung von Java 8, Caching sowie die statische und dynamische Erzeugung von Abfragen gibt es in meinem Buch "Hibernate Tips: More than 70 solutions to common Hibernate problems". Es ist als Taschenbuch und E-Book auf Amazon und als PDF auf hibernate-tips.com erhältlich.