Das ist nützlich. Dies zeigt mir jedoch nicht die tatsächlichen SQL-Abfragen.
Nicolas Barbulesco
6
@Nicolas das stimmt, aber unmittelbar nach der Abfrage werden die gebundenen Parameter angezeigt.
Xtreme Biker
2
Ich verwende Grails 2.4.4 und Hibernate 4. Das Ändern der log4j-Konfiguration hat bei mir nicht funktioniert, aber p6spy hat funktioniert!
Champ
11
In Hibernate 5 können wir org.hibernate.type.descriptor.sql.BasicBinderLogger verwenden. Durch das Aktivieren der Anmeldung wurden org.hibernate.typezu viele nutzlose Informationen für mich gedruckt ...
csharpfolk
5
org.hibernate.typeund org.hibernate.loader.hqlnicht für mich arbeiten, um die Parameter zu zeigen
Dherik
75
Der Einfachheit halber finden Sie hier das gleiche Konfigurationsbeispiel für Logback (SLF4J).
Danke, hat bei mir wirklich gut funktioniert. Diese Einstellungen fügen unter der SQL-Abfrage einen Parameter wie hinzu binding parameter [1] as [VARCHAR] - [1].
G. Ciardini
28
Wenn ein Spring Boot verwendet wird, konfigurieren Sie einfach Folgendes:
Log4JDBC ist eine nette Lösung, die das genaue SQL druckt , das mit vorhandenen Parametern in die Datenbank gelangt, und nicht die beliebteste Antwort, die dies nicht tut. Ein wesentlicher Vorteil dabei ist, dass Sie SQL direkt in Ihr DB-Frontend kopieren und unverändert ausführen können.
Meine Konfigurationsdatei logback.xml sieht wie folgt aus: Hiermit werden alle SQL-Anweisungen mit Parametern sowie die Ergebnismengen-Tabellen für alle Abfragen ausgegeben.
<?xml version="1.0" encoding="UTF-8"?><configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern></encoder></appender><loggername="jdbc.audit"level="ERROR"/><loggername="jdbc.connection"level="ERROR"/><loggername="jdbc.sqltiming"level="ERROR"/><loggername="jdbc.resultset"level="ERROR"/><!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT --><!--<logger name="jdbc.resultsettable" level="ERROR" /> --><rootlevel="debug"><appender-refref="STDOUT"/></root></configuration>
Schließlich musste ich eine Datei mit dem Namen log4jdbc.log4j2.properties im Stammverzeichnis des Klassenpfads erstellen, z. B. src / test / resources oder src / main / resources in einem Mevn-Projekt. Diese Datei enthält eine Zeile:
10:44:29.400[main] DEBUG jdbc.sqlonly - org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)5.select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_,
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=10410:44:29.402[main] INFO jdbc.resultsettable -|----------|---|---|----------|--------|---|-----||member_id |id |id |member_id |role_id |id |name ||----------|---|---|----------|--------|---|-----||----------|---|---|----------|--------|---|-----|
Hey .... das scheint cool .... genau das, was der Arzt für mich bestellt hat :) ... aber unterstützt es auch CLOB / BLOB ?? Es ist auch möglich, nur die Abfrage und nicht die Ergebnismenge anzuzeigen. - Danke :)
Dev Ray
1
Können Sie mir ein Beispiel für die Konfiguration geben, wie das geht?
Grep
Tatsächlich gibt letzteres eine tabellarische Darstellung der Abfrageergebnisse aus ... dh man benötigt log4jdbc-remix für diese nette Funktion.
Meriton
Diese Lösung war am besten für meine Situation geeignet, in der ich die Zeilennummernwerte anzeigen musste, die der Ruhezustand für Paging-Ergebnismengen generiert. Die Ablaufverfolgungsprotokollierung zeigt nur Abfrageparameterwerte an.
Oliver Hernandez
@Alan Hay protokolliert dies auch native Abfragen?
Die org.hibernate.type.descriptor.sql.BasicBinderKategorie enthält nicht alle Parameter, z. B. Aufzählungstypen. Wenn Sie also alles wollen, brauchen Sie wirklich TRACEfür die gesamte org.hibernate.typeGruppe.
Seanf
Bei mir funktioniert es in Hibernate 4.3! Außerdem würde ich nicht den vollständigen org.hibernate.type verfolgen, da dies viel zu viel Ausgabe ist. In den meisten Fällen reicht diese Lösung aus.
Cslotty
Beachten Sie, dass org.hibernate.type.descriptor.sql.BasicExtractor die Ergebnismengen protokolliert. Ein großer Eintrag kann sogar die Anwendung beim Anmelden an der Konsole in Eclipse zum Absturz bringen, und ich nehme an, dass dies auch nicht ideal für das Anmelden bei Dateien ist. Deshalb bevorzuge ich diese Lösung, sie funktioniert auch in Hibernate 3. Für diejenigen, die an Aufzählungstypen interessiert sind, probieren Sie bitte die genaue Klasse aus, die sie protokolliert, wenn org.hibernate.type = TRACE. Setzen Sie dann org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE.
Die Lösung ist korrekt, protokolliert jedoch auch alle Bindungen für die Ergebnisobjekte. Um dies zu verhindern, können Sie einen separaten Appender erstellen und die Filterung aktivieren, zum Beispiel:
<!-- A time/date based rolling appender --><appendername="FILE_HIBERNATE"class="org.jboss.logging.appender.DailyRollingFileAppender"><errorHandlerclass="org.jboss.logging.util.OnlyOnceErrorHandler"/><paramname="File"value="${jboss.server.log.dir}/hiber.log"/><paramname="Append"value="false"/><paramname="Threshold"value="TRACE"/><!-- Rollover at midnight each day --><paramname="DatePattern"value="'.'yyyy-MM-dd"/><layoutclass="org.apache.log4j.PatternLayout"><!-- The default pattern: Date Priority [Category] Message\n --><paramname="ConversionPattern"value="%d %-5p [%c] %m%n"/></layout><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="bind"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="select"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.DenyAllFilter"/></appender><categoryname="org.hibernate.type"><priorityvalue="TRACE"/></category><loggername="org.hibernate.type"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger><loggername="org.hibernate.SQL"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger>
**If you want hibernate to print generated sql queries with real values instead of question marks.****add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true**Andadd following entry in log4j.properties :**
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
Hey single31 obige Zeilen müssen in deine Hibernate-Konfigurationsdatei eingefügt werden, dann wird es definitiv funktionieren. Ich poste immer etwas, was ich praktisch gemacht habe.
Vijay Bhatt
3
Diese Antwort ist eine kleine Abweichung für die Frage. Manchmal benötigen wir die SQL nur für Debug-Zwecke zur Laufzeit. In diesem Fall gibt es eine einfachere Möglichkeit, Debugging für Editoren zu verwenden.
Setzen Sie einen Haltepunkt auf org.hibernate.loader.Loader.loadEntityBatch (oder navigieren Sie bis dahin auf dem Stapel).
Wenn die Ausführung angehalten wird, überprüfen Sie den Wert der Variablen this.sql.
Dies ist für den Ruhezustand 3. Ich bin nicht sicher, ob dies auf anderen Versionen funktioniert.
Der mysql jdbc-Treiber bietet bereits eine praktische Möglichkeit, um diese Anforderung zu erfüllen. Sie müssen mindestens die jar-Version> = mysql-connect-jar-5.1.6.jar haben
Schritt 1: [Konfigurieren Sie Ihre jdbc.url, um Logger und benutzerdefinierte Protokollierung hinzuzufügen]
Jetzt wird die slf4j-Protokollierung verwendet. Wenn Ihre Standardprotokollierung log4j ist, müssen Sie die Abhängigkeiten slf4j-api und slf4j-log4j12 hinzufügen, um die slf4j-Protokollierung verwenden zu können
Schritt 2: [Schreiben Sie Ihre benutzerdefinierte Protokollierung]
package com.xxx;import java.sql.SQLException;import java.util.Properties;import com.mysql.jdbc.Connection;import com.mysql.jdbc.log.Log;publicclassCustomLoggingProfilerEventHandlerimplementsProfilerEventHandler{privateLog log;publicLoggingProfilerEventHandler(){}publicvoid consumeEvent(ProfilerEvent evt){/**
* you can only print the sql as this.log.logInfo(evt.getMessage())
* you can adjust your sql print log level with: DEBUG,INFO
* you can also handle the message to meet your requirement
*/this.log.logInfo(evt);}publicvoid destroy(){this.log =null;}publicvoid init(Connection conn,Properties props)throwsSQLException{this.log = conn.getLog();}}
Hey - das ist schön. Aber ich denke hier werden die Abfragen mit dem gedruckt? gefolgt von Parameterwerten. Da ich unendlich viele Abfragen habe, brauche ich etwas, das ich einfach in den SQL-Editor kopieren und einfügen kann, und sie werden ausgeführt. Gibt es eine Möglichkeit, dies mit diesem Ansatz zu tun? Ich bin nicht so begeistert von Bibliotheken von Drittanbietern. Danke :)
Dev Ray
Vielen Dank. Ich hatte gehofft, keine Lösungen von Drittanbietern verwenden und direkt in den Ruhezustand wechseln zu müssen, aber ich glaube, ich habe keine andere Wahl.
Dev Ray
2
Die Protokollierung funktioniert, aber nicht genau das, was Sie wollen oder ich wollte vor einiger Zeit, aber P6Spy funktioniert perfekt .
Hier ist das einfache Tutorial, das Sie implementieren können, sowie das MKYONG-Tutorial für P6Spy .
Extrahieren Sie die p6spy-install.jarDatei, suchen Sie nach p6spy.jarundspy.properties
Bibliotheksabhängigkeit hinzufügen
Hinzufügen p6spy.jar in Ihre Projektbibliothek Abhängigkeit hinzu
Ändern Sie die P6Spy-Eigenschaftendatei
Ändern Sie Ihre Datenbankkonfigurationsdatei. Sie müssen Ihren vorhandenen JDBC-Treiber durch den P6Spy-JDBC-Treiber ersetzen.com.p6spy.engine.spy.P6SpyDriver
Original ist MySQL JDBC-Treiber - com.mysql.jdbc.Driver
P6Spy-Eigenschaftendatei
ändern Ändern Sie die P6Spy-Eigenschaftendatei -spy.properties
Ersetzen Sie den real driverdurch Ihren vorhandenen MySQL JDBC-Treiber
realdriver=com.mysql.jdbc.Driver#specifies another driver to use
realdriver2=#specifies a third driver to use
realdriver3=
Ändern des Speicherorts der Protokolldatei Ändern Sie den Speicherort der Protokolldatei in der Eigenschaft logfile. Alle SQL-Anweisungen werden in diese Datei eingeloggt.
Windows
logfile = c:/spy.log
* nix
logfile =/srv/log/spy.log
In “spy.properties”Projektklassenpfad kopieren
Kopieren Sie “spy.properties”in Ihren Projektstammordner und stellen Sie sicher, dass Ihr Projekt "spy.properties" finden kann. Andernfalls wird “spy.properties”die Ausnahme " Datei nicht gefunden " angezeigt .
Dies war für mich der einfachste Weg in meiner Spring Boot-Anwendung, in der ich versuchte, aus einem Komponententest generiertes SQL zu protokollieren. Ich habe Gradle eine Testabhängigkeit hinzugefügt (testCompile 'p6spy: p6spy: 3.8.5') und application.yml angepasst, um spring.datasource.url = jdbc: p6spy: h2: mem: testdb und spring.datasource.driver-class- festzulegen name = com.p6spy.engine.spy.P6SpyDriver und fügte dann spy.properties hinzu, wobei realdriver = org.h2.Driver und die Protokolldatei auf meinen bevorzugten Pfad festgelegt waren. Es war einfach, das gesamte SQL aus der resultierenden Protokolldatei zu extrahieren. Das einzige Problem war, dass H2 das generierte Zeitstempelformat nicht mochte.
Durch diesen Thread habe ich herausgefunden, dass das vom Ruhezustand verwendete jboss-Protokollierungsframework konfiguriert werden muss, um über slf4j zu protokollieren. Ich habe den VM-Argumenten der Anwendung das folgende Argument hinzugefügt:
2013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL:select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca'and noti.visible='S'and noti.idmicrosite=985and noti.tipo=34462013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL:select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where(traduccion1_.NID_CODIDI='ca')and(noticia0_.NOT_VISIB='S')and(noticia0_.NOT_MICCOD=985)and(noticia0_.NOT_TIPO=3446)
Hey ... ich kann keine Beispiele für diesen Ansatz finden. Könnten Sie Referenzen / Beispiele / Tutorials bereitstellen? Und ist es immer noch dasselbe mit den neuesten Versionen oder hibernate / log4j oder ist es zu einem org.hibernate.QueryTranslator oder so geworden? Danke
Dev Ray
Hey ... Ich habe es versucht, aber das scheint beim Speichern oder Aktualisieren nicht zu funktionieren. Ich denke, es funktioniert nur für ausgewählte Abfragen, bei denen die Übersetzung von hql nach sql ins Spiel kommt
dev ray
1
Das Log4Jdbc-Plugin ist am besten für Ihre Anforderung geeignet. Es zeigt Folgendes:
1.Complete SQL query being hit to the db
2.Parameter values being passed to the query
3.Execution time taken by each query
Siehe untenstehenden Link zum Konfigurieren von Log4Jdbc-
Keine der oben genannten Antworten druckt SQL mit den richtigen Parametern oder ist schmerzhaft. Dies wurde durch die Verwendung von WireShark erreicht , das alle SQL / Befehle erfasst, die mit den Abfragen von der Anwendung an Oracle / MySQL usw. gesendet werden.
Alle Antworten hier sind hilfreich. Wenn Sie jedoch eine XML-Datei für den Spring-Anwendungskontext verwenden, um Ihre Sitzungsfactory einzurichten, können Sie durch Festlegen der SQL-Variablen log4j nur einen Teil des Weges dorthin zurücklegen. Außerdem müssen Sie die Variable hibernate.show_sql festlegen im App-Kontext selbst, damit Hibernate die Werte tatsächlich anzeigt.
ApplicationContext.xml hat:
<propertyname="hibernateProperties"><value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value></property>
Danke, es druckt die Abfrage, aber nicht die Parameter, die es verwendet hat. Gibt es eine Möglichkeit, die Parameter auch zu drucken?
Liz Lamperouge
0
Der Ruhezustand zeigt die Abfrage und ihre Parameterwerte in verschiedenen Zeilen an.
Wenn Sie application.properties im Frühjahrsstart verwenden und den unten hervorgehobenen Parameter in application.properties verwenden können.
org.hibernate.SQL zeigt Abfragen an
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type zeigt alle Parameterwerte an, die mit Auswahl-, Einfüge- und Aktualisierungsabfragen verknüpft werden. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType zeigt den Parameterwert des Aufzählungstyps an
logging.level.org.hibernate.type.EnumType = TRACE
Beispiel ::
2018-06-1411:06:28,217 TRACE [main][EnumType.java :321]Binding[active] to parameter:[1]
sql.BasicBinder zeigt den Parameterwert Integer, Varchar und Boolescher Typ an
Auch hier werden die Werte für Limit und Offset in Abfragen nicht angezeigt.
T3rm1
0
Die einfachste Lösung für mich ist die Implementierung eines regulären stringReplace, um Parametereingaben durch Parameterwerte zu ersetzen (der Einfachheit halber werden alle Parameter als Zeichenfolge behandelt):
String debugedSql = sql;//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key,"'"+value.toString()+"'");//and finnaly
println(debugedSql);
oder ähnliches für Positionsparameter (?).
Achten Sie auf Nullwerte und bestimmte Werttypen wie Datum, wenn eine laufbereite SQL protokolliert werden soll.
Antworten:
Sie müssen die Protokollierung für die folgenden Kategorien aktivieren :
org.hibernate.SQL
- festlegen, dassdebug
alle SQL-DML-Anweisungen bei ihrer Ausführung protokolliert werdenorg.hibernate.type
- auf einstellen,trace
um alle JDBC-Parameter zu protokollierenEine log4j-Konfiguration könnte also folgendermaßen aussehen:
Die erste entspricht der
hibernate.show_sql=true
Legacy- Eigenschaft , die zweite druckt unter anderem die gebundenen Parameter.Eine andere Lösung (nicht im Ruhezustand) wäre die Verwendung eines JDBC-Proxy-Treibers wie P6Spy .
quelle
org.hibernate.type.descriptor.sql.BasicBinder
Logger verwenden. Durch das Aktivieren der Anmeldung wurdenorg.hibernate.type
zu viele nutzlose Informationen für mich gedruckt ...org.hibernate.type
undorg.hibernate.loader.hql
nicht für mich arbeiten, um die Parameter zu zeigenDer Einfachheit halber finden Sie hier das gleiche Konfigurationsbeispiel für Logback (SLF4J).
Die Ausgabe in Ihrem sql.log (Beispiel) sieht dann folgendermaßen aus:
quelle
Wechseln
hibernate.cfg.xml
zu:Fügen Sie log4j und folgende Einträge in "log4j.properties" ein:
quelle
binding parameter [1] as [VARCHAR] - [1]
.Wenn ein Spring Boot verwendet wird, konfigurieren Sie einfach Folgendes:
aplication.yml
aplication.properties
und nichts weiter.
HTH
quelle
Log4JDBC ist eine nette Lösung, die das genaue SQL druckt , das mit vorhandenen Parametern in die Datenbank gelangt, und nicht die beliebteste Antwort, die dies nicht tut. Ein wesentlicher Vorteil dabei ist, dass Sie SQL direkt in Ihr DB-Frontend kopieren und unverändert ausführen können.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
Letzteres gibt auch eine tabellarische Darstellung der Abfrageergebnisse aus.
Beispielausgabe, die generiertes SQL mit vorhandenen Parametern zusammen mit der Ergebnismengen-Tabelle aus der Abfrage zeigt:
Update 2016
Zuletzt habe ich jetzt log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) mit SLF4j und Logback verwendet. Die für mein Setup erforderlichen Maven-Abhängigkeiten sind wie folgt:
Die Treiber- und DB-URLs sehen dann folgendermaßen aus:
Meine Konfigurationsdatei logback.xml sieht wie folgt aus: Hiermit werden alle SQL-Anweisungen mit Parametern sowie die Ergebnismengen-Tabellen für alle Abfragen ausgegeben.
Schließlich musste ich eine Datei mit dem Namen log4jdbc.log4j2.properties im Stammverzeichnis des Klassenpfads erstellen, z. B. src / test / resources oder src / main / resources in einem Mevn-Projekt. Diese Datei enthält eine Zeile:
Das Obige hängt von Ihrer Protokollierungsbibliothek ab. Weitere Informationen finden Sie in den Dokumenten unter https://code.google.com/archive/p/log4jdbc-log4j2
Beispielausgabe:
quelle
Sie können log4j.xml Kategoriezeilen hinzufügen:
und fügen Sie Eigenschaften für den Ruhezustand hinzu:
quelle
Fügen Sie Ihrer log4j- oder logback-Konfiguration folgende Eigenschaften und Werte hinzu:
quelle
org.hibernate.type.descriptor.sql.BasicBinder
Kategorie enthält nicht alle Parameter, z. B. Aufzählungstypen. Wenn Sie also alles wollen, brauchen Sie wirklichTRACE
für die gesamteorg.hibernate.type
Gruppe.Sie können dies mit dem Datenquellen-Proxy tun , wie ich in diesem Beitrag beschrieben habe .
Angenommen, Ihre Anwendung erwartet eine
dataSource
Bean (z. B. via@Resource
), können Sie Folgendes konfigurierendatasource-proxy
:Nun die Hibernate-Ausgabe gegen den Datenquellen-Proxy:
Die
datasource-proxy
Abfragen enthalten Parameterwerte, und Sie können sogar benutzerdefinierte JDBC-Anweisungsabfangjäger hinzufügen, damit Sie N + 1-Abfrageprobleme direkt aus Ihren Integrationstests heraus erkennen können .quelle
Schalten Sie den
org.hibernate.type
Logger ein, um zu sehen, wie die tatsächlichen Parameter an die Fragezeichen gebunden werden.quelle
quelle
Die Lösung ist korrekt, protokolliert jedoch auch alle Bindungen für die Ergebnisobjekte. Um dies zu verhindern, können Sie einen separaten Appender erstellen und die Filterung aktivieren, zum Beispiel:
quelle
quelle
Diese Antwort ist eine kleine Abweichung für die Frage. Manchmal benötigen wir die SQL nur für Debug-Zwecke zur Laufzeit. In diesem Fall gibt es eine einfachere Möglichkeit, Debugging für Editoren zu verwenden.
Dies ist für den Ruhezustand 3. Ich bin nicht sicher, ob dies auf anderen Versionen funktioniert.
quelle
Der mysql jdbc-Treiber bietet bereits eine praktische Möglichkeit, um diese Anforderung zu erfüllen. Sie müssen mindestens die jar-Version> = mysql-connect-jar-5.1.6.jar haben
Schritt 1: [Konfigurieren Sie Ihre jdbc.url, um Logger und benutzerdefinierte Protokollierung hinzuzufügen]
Jetzt wird die slf4j-Protokollierung verwendet. Wenn Ihre Standardprotokollierung log4j ist, müssen Sie die Abhängigkeiten slf4j-api und slf4j-log4j12 hinzufügen, um die slf4j-Protokollierung verwenden zu können
Schritt 2: [Schreiben Sie Ihre benutzerdefinierte Protokollierung]
quelle
Ich mag das für log4j:
quelle
Die Protokollierung funktioniert, aber nicht genau das, was Sie wollen oder ich wollte vor einiger Zeit, aber P6Spy funktioniert perfekt .
Hier ist das einfache Tutorial, das Sie implementieren können, sowie das MKYONG-Tutorial für P6Spy .
Für mich hat es wie Charme funktioniert.
Bekommen das "p6spy-install.jar"
Extrahieren Sie die
p6spy-install.jar
Datei, suchen Sie nachp6spy.jar
undspy.properties
Hinzufügen
p6spy.jar
in Ihre Projektbibliothek Abhängigkeit hinzuÄndern Sie Ihre Datenbankkonfigurationsdatei. Sie müssen Ihren vorhandenen JDBC-Treiber durch den P6Spy-JDBC-Treiber ersetzen.
com.p6spy.engine.spy.P6SpyDriver
Original ist MySQL JDBC-Treiber -
com.mysql.jdbc.Driver
Geändert in P6Spy JDBC-Treiber -
com.p6spy.engine.spy.P6SpyDriver
spy.properties
Ersetzen Sie den
real driver
durch Ihren vorhandenen MySQL JDBC-TreiberÄndern des Speicherorts der Protokolldatei Ändern Sie den Speicherort der Protokolldatei in der Eigenschaft logfile. Alle SQL-Anweisungen werden in diese Datei eingeloggt.
Windows
* nix
“spy.properties”
Projektklassenpfad kopierenKopieren Sie
“spy.properties”
in Ihren Projektstammordner und stellen Sie sicher, dass Ihr Projekt "spy.properties" finden kann. Andernfalls wird“spy.properties”
die Ausnahme " Datei nicht gefunden " angezeigt .quelle
quelle
Mit Hibernate 4 und slf4j / log4j2 habe ich versucht, Folgendes in meine log4j2.xml-Konfiguration aufzunehmen:
Aber ohne Erfolg.
Durch diesen Thread habe ich herausgefunden, dass das vom Ruhezustand verwendete jboss-Protokollierungsframework konfiguriert werden muss, um über slf4j zu protokollieren. Ich habe den VM-Argumenten der Anwendung das folgende Argument hinzugefügt:
Und es hat wie ein Zauber funktioniert.
quelle
Folgendes hat bei mir funktioniert: Setzen Sie die folgende Eigenschaft in der Datei log4j.file:
Einstellungen für den Ruhezustand:
quelle
Fügen Sie für die Entwicklung mit Wildfly (standalone.xml) die folgenden Logger hinzu:
quelle
Wenn Sie den Ruhezustand 3.2.xx verwenden, verwenden Sie
anstatt
quelle
Sie können dies protokollieren:
Ausgabebeispiel:
quelle
Das Log4Jdbc-Plugin ist am besten für Ihre Anforderung geeignet. Es zeigt Folgendes:
Siehe untenstehenden Link zum Konfigurieren von Log4Jdbc-
quelle
Verwenden Sie Wireshark oder ähnliches:
Keine der oben genannten Antworten druckt SQL mit den richtigen Parametern oder ist schmerzhaft. Dies wurde durch die Verwendung von WireShark erreicht , das alle SQL / Befehle erfasst, die mit den Abfragen von der Anwendung an Oracle / MySQL usw. gesendet werden.
quelle
Alle Antworten hier sind hilfreich. Wenn Sie jedoch eine XML-Datei für den Spring-Anwendungskontext verwenden, um Ihre Sitzungsfactory einzurichten, können Sie durch Festlegen der SQL-Variablen log4j nur einen Teil des Weges dorthin zurücklegen. Außerdem müssen Sie die Variable hibernate.show_sql festlegen im App-Kontext selbst, damit Hibernate die Werte tatsächlich anzeigt.
ApplicationContext.xml hat:
Und Ihre log4j-Datei benötigt
quelle
In Java:
Transformieren Sie Ihre Abfrage in TypedQuery, wenn es sich um eine CriteriaQuery handelt (javax.persistence).
Dann:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
quelle
Der Ruhezustand zeigt die Abfrage und ihre Parameterwerte in verschiedenen Zeilen an.
Wenn Sie application.properties im Frühjahrsstart verwenden und den unten hervorgehobenen Parameter in application.properties verwenden können.
org.hibernate.SQL zeigt Abfragen an
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type zeigt alle Parameterwerte an, die mit Auswahl-, Einfüge- und Aktualisierungsabfragen verknüpft werden. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType zeigt den Parameterwert des Aufzählungstyps an
logging.level.org.hibernate.type.EnumType = TRACE
Beispiel ::
sql.BasicBinder zeigt den Parameterwert Integer, Varchar und Boolescher Typ an
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
Beispiel ::
quelle
Die einfachste Lösung für mich ist die Implementierung eines regulären stringReplace, um Parametereingaben durch Parameterwerte zu ersetzen (der Einfachheit halber werden alle Parameter als Zeichenfolge behandelt):
oder ähnliches für Positionsparameter (?).
Achten Sie auf Nullwerte und bestimmte Werttypen wie Datum, wenn eine laufbereite SQL protokolliert werden soll.
quelle