Logowanie zapytań SQL w Hibernate jest możliwe po włączeniu opcji show_sql na true, jednak nie jest ono doskonałe. Otrzymujemy wtedy logi ze znakami zapytania w miejscu wartości przekazanych do zapytania SQL. Istnieje kilka sposobów logowania pełnych zapytań, przykładem jest sterownik JDBC z projektu log4jdbc, występujący również w wersji zmodyfikowanej log4jdbc-remix. Aby skonfigurować log4jdbc należy najpierw dodać zależność maven`a do pliku pom.xml projektu:
<dependency>
<groupId>net.sf.log4jdbc</groupId>
<artifactId>log4jdbc</artifactId>
<version>1.2beta2</version>
<scope>test</scope>
</dependency>
Oczywiście będzie to działać jeśli dodamy sobie tego jarka do repozytorium maven`a, bo z tego co wiem jest jeszcze nie dostępny w oficjalnym repo. Scope test ze względu na testowe przeznaczenie logowania. Nie zalecane jest używanie tego sterownika w instalacji produkcyjnej ze względu na obniżenie wydajności przez konieczność generowania logów przez sterownik.
Następnie należy zmodyfikować połączenie z bazą danych zamieniając driver_class na:
hibernate.connection.driver_class=net.sf.log4jdbc.DriverSpy
oraz zmienić url do bazy dodając człon log4jdbc, np:
hibernate.connection.url=jdbc:log4jdbc:h2:mem:test
Przykładowa konfiguracja log4j dla logowania zapytań i czasów ich wykonania dla testów jednostkowych (do dokonfigurowania wg preferencji):
log4j.rootLogger=info, stdout
og4j.logger.jdbc.audit=FATAL
log4j.additivity.jdbc.audit=false
log4j.logger.jdbc.sqlonly=INFO
log4j.additivity.jdbc.sqlonly=false
log4j.logger.jdbc.resultset=FATAL
log4j.additivity.jdbc.resultset=false
og4j.logger.jdbc.sqltiming=INFO, stdout
og4j.additivity.jdbc.sqltiming=false
log4j.logger.jdbc.connection=FATAL
log4j.additivity.jdbc.connection=false
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n
W przypadku korzystania z powyższego rozwiązania w Hibernate należy wyłączyć opcję show_sql, ustawiając jej wartość na false.
Linki:
http://code.google.com/p/log4jdbc/
http://code.google.com/p/log4jdbc/source/browse/trunk/doc/log4j.properties
http://code.google.com/p/log4jdbc/source/browse/trunk/doc/log4j.xml
http://code.google.com/p/log4jdbc-remix/