Keine der angebotenen Lösungen funktioniert für mich. Ich schreibe das nur, um alle wissen zu lassen, wie verzweifelt ich bin.
Andrea
Antworten:
130
Rahmen
datasource {...
logSql = true
}
in DataSource.groovy (gemäß diesen Anweisungen) war genug, um es in meiner Umgebung zum Laufen zu bringen. Es scheint, dass Teile der FAQ veraltet sind (z. B. die Frage "Viele-zu-Viele-Spalten rückwärts"), sodass sich dies möglicherweise auch in der Zwischenzeit geändert hat.
logSql=trueallein reicht nicht aus. Die Protokollierung im Ruhezustand muss ebenfalls aktiviert sein. Siehe @ Petes Antwort.
Jason
2
Ich habe festgestellt, dass dies nicht die Werte enthält, die in den SQL-Anweisungen enthalten sind, in denen sich die "?" S befinden.
Jason
1
Dies funktioniert, aber für alle Abfragen. Ist es auch möglich, die generierte SQL für ein bestimmtes Kriterium zu drucken, ohne logSql = true setzen zu müssen?
Guus
@Guus Wie kann ich die generierte SQL für ein bestimmtes Kriterium drucken?
Biniam
@biniam_Ethiopia Soweit ich weiß, ist dies nicht möglich. Ich möchte dies ebenso wie es ärgerlich ist, bestimmte Klassen zu debuggen und andere Abfragen nicht zu sehen.
Guus
91
Ich finde es nützlicher, Folgendes zu tun, nämlich die Protokollierung von Hibernate zu aktivieren, um das SQL zusammen mit Bindungsvariablen zu protokollieren (damit Sie die an Ihre Aufrufe übergebenen Werte sehen und das SQL einfach in Ihrem Editor oder auf andere Weise replizieren können).
In Ihrem Config.groovy, fügen Sie folgendes zu Ihrem log4j Block:
log4j ={// Enable Hibernate SQL logging with param values
trace 'org.hibernate.type'
debug 'org.hibernate.SQL'//the rest of your logging config
//...}
Ich habe das schon oft benutzt. Eines ist zu beachten: Die Ausgabe der Parameter ist sehr teuer. Ich würde empfehlen, dies nur auf Ihrer Entwicklungsbox zu tun.
John Gordon
2
Sie können auch format_sql = truein den hibernateBlock Ihres hinzufügen, DataSource.groovyum eine schön formatierte Ausgabe zu erhalten.
Gregor Petrin
1
Hinweis: Hiermit werden sowohl Klauselparameter als auch Spaltenwerte protokolliert, die aus Abfrageergebnismengen extrahiert wurden. Verwenden Sietrace 'org.hibernate.type.BasicBinder'
GreenGiant
Kennt jemand das Äquivalent für Grails 3.3.8?
John Little
Aus irgendeinem Grund werden syntaktisch ungültige Abfragen (leider von Hibernate selbst generiert!) Nicht protokolliert - alle anderen Abfragen werden protokolliert ... Möglicherweise ein Problem mit Hibernate selbst?
Dadurch werden die Leistungsprobleme bei der Ablaufverfolgungsprotokollierung des Hibernate- typePakets vermieden . Dies funktioniert mit Hibernate 3.6 und höher. Ich habe dies von: https://burtbeckwith.com/blog/?p=1604
Die Lösung ist nur für die Entwicklung, nicht für die Produktion.
Alle obigen Antworten funktionieren und sind korrekt. Sie zeigen jedoch nicht die vollständige Abfrage auf eine gut lesbare Weise. Wenn Sie die letzte (ohne?,?) Abfrage sehen möchten, haben Sie zwei Möglichkeiten.
A) Proxy Ihrer JDBC-Verbindung mit log4jdbc oder p6Spy.
B) Betrachten Sie es auf Datenbankebene. Zum Beispiel sehr einfach mit MySQL zu tun.
Finden Sie heraus, wo sich Ihre general_log_file befindet. Aktives allgemeines Protokoll, falls noch nicht aktiviert.
mysql command line> show variables like"%general_log%";
mysql command line>set global general_log = true;
Jetzt wird alles in Ihrer Protokolldatei protokolliert. Mac / Linux-Beispiel, um einen schönen Stream Ihrer Abfragen anzuzeigen.
Nur als Referenz, aber ich verwende p6spy, um die SQL-Abfragen zu protokollieren. Es ist ein kleiner JDBC-Zwischentreiber. Die genaue Abfrage wird so protokolliert, als würde sie an den Server gesendet (einschließlich Parameter).
Nehmen Sie es in Ihr Projekt auf:
runtime 'p6spy:p6spy:3.0.0'
Ändern Sie Ihren Datenquellentreiber:
driverClassName: com.p6spy.engine.spy.P6SpyDriver
Und deine JDBC-URL:
url: jdbc:p6spy:mysql://
Konfigurieren Sie es mit spy.properties (in grails-app / conf).
Ich weiß, dass dies vor langer Zeit gestellt und beantwortet wurde. Aber ich habe diese Frage zufällig gesehen und konnte mich nicht davon abhalten, unseren Implementierungsansatz für die SQL-Protokollierung in unserem Projekt zu beantworten oder zu teilen. Hoffe es hilft etwas.
Derzeit befindet es sich in einer Entwicklungsumgebung. Wir verwenden "log4jdbc Driver Spy", um SQL zu protokollieren.
Aufbau:
Fügen Sie in Ihrem BuildConfig.groovy die folgenden Abhängigkeiten hinzu:
Und in Ihrer DataSource oder einer anderen konfigurationsbezogenen Konfiguration: [wo immer Sie die datenquellenbezogene Konfiguration definiert haben], Hinzufügen:
Aus meiner persönlichen Erfahrung fand ich es beim Debuggen sehr nützlich und hilfreich. Weitere Informationen finden Sie auf dieser Website. https://code.google.com/p/log4jdbc-remix/
Dies ist eine Variation vieler der oben genannten Lösungen, ermöglicht es Ihnen jedoch, den Wert zur Laufzeit zu optimieren. Und genau wie bei den anderen Lösungen, die sich damit befassen logToStdout, werden nur die Abfragen und nicht die Bindungswerte angezeigt.
Die Idee wurde einem Burtbeck mit einem Post gestohlen, den ich vor einigen Jahren gelesen habe und den ich momentan nicht finden kann. Es wurde bearbeitet, um mit Grails 3.3 zu arbeiten.
Eine ähnliche Technik kann verwendet werden, um die Protokollierung für bestimmte Integrationstests zu aktivieren:
Antworten:
Rahmen
in DataSource.groovy (gemäß diesen Anweisungen) war genug, um es in meiner Umgebung zum Laufen zu bringen. Es scheint, dass Teile der FAQ veraltet sind (z. B. die Frage "Viele-zu-Viele-Spalten rückwärts"), sodass sich dies möglicherweise auch in der Zwischenzeit geändert hat.
quelle
logSql=true
allein reicht nicht aus. Die Protokollierung im Ruhezustand muss ebenfalls aktiviert sein. Siehe @ Petes Antwort.Ich finde es nützlicher, Folgendes zu tun, nämlich die Protokollierung von Hibernate zu aktivieren, um das SQL zusammen mit Bindungsvariablen zu protokollieren (damit Sie die an Ihre Aufrufe übergebenen Werte sehen und das SQL einfach in Ihrem Editor oder auf andere Weise replizieren können).
In Ihrem
Config.groovy
, fügen Sie folgendes zu Ihrem log4j Block:quelle
format_sql = true
in denhibernate
Block Ihres hinzufügen,DataSource.groovy
um eine schön formatierte Ausgabe zu erhalten.trace 'org.hibernate.type.BasicBinder'
Für Grale 3. *
Option 1 fügt logback.groovy Folgendes hinzu
oder
Option 2 fügt der dataSource in der application.yml Folgendes hinzu. Dieser Ansatz protokolliert jedoch nicht die Parameterwerte
quelle
Versuche dies:
Dadurch werden die Leistungsprobleme bei der Ablaufverfolgungsprotokollierung des Hibernate-
type
Pakets vermieden . Dies funktioniert mit Hibernate 3.6 und höher. Ich habe dies von: https://burtbeckwith.com/blog/?p=1604quelle
Die Lösung ist nur für die Entwicklung, nicht für die Produktion.
Alle obigen Antworten funktionieren und sind korrekt. Sie zeigen jedoch nicht die vollständige Abfrage auf eine gut lesbare Weise. Wenn Sie die letzte (ohne?,?) Abfrage sehen möchten, haben Sie zwei Möglichkeiten.
A) Proxy Ihrer JDBC-Verbindung mit log4jdbc oder p6Spy.
B) Betrachten Sie es auf Datenbankebene. Zum Beispiel sehr einfach mit MySQL zu tun.
Finden Sie heraus, wo sich Ihre general_log_file befindet. Aktives allgemeines Protokoll, falls noch nicht aktiviert.
Jetzt wird alles in Ihrer Protokolldatei protokolliert. Mac / Linux-Beispiel, um einen schönen Stream Ihrer Abfragen anzuzeigen.
quelle
Nur als Referenz, aber ich verwende p6spy, um die SQL-Abfragen zu protokollieren. Es ist ein kleiner JDBC-Zwischentreiber. Die genaue Abfrage wird so protokolliert, als würde sie an den Server gesendet (einschließlich Parameter).
Nehmen Sie es in Ihr Projekt auf:
Ändern Sie Ihren Datenquellentreiber:
Und deine JDBC-URL:
Konfigurieren Sie es mit spy.properties (in grails-app / conf).
Vergessen Sie nicht, dies für die Produktion zu deaktivieren!
quelle
Ich weiß, dass dies vor langer Zeit gestellt und beantwortet wurde. Aber ich habe diese Frage zufällig gesehen und konnte mich nicht davon abhalten, unseren Implementierungsansatz für die SQL-Protokollierung in unserem Projekt zu beantworten oder zu teilen. Hoffe es hilft etwas.
Derzeit befindet es sich in einer Entwicklungsumgebung. Wir verwenden "log4jdbc Driver Spy", um SQL zu protokollieren.
Aufbau:
Fügen Sie in Ihrem BuildConfig.groovy die folgenden Abhängigkeiten hinzu:
Und in Ihrer DataSource oder einer anderen konfigurationsbezogenen Konfiguration: [wo immer Sie die datenquellenbezogene Konfiguration definiert haben], Hinzufügen:
Aus meiner persönlichen Erfahrung fand ich es beim Debuggen sehr nützlich und hilfreich. Weitere Informationen finden Sie auf dieser Website. https://code.google.com/p/log4jdbc-remix/
König Grüße
quelle
Weiter funktioniert bei mir:
grails-app / conf / application.yml
grails-app / conf / logback.groovy
Quelle: http://sergiodelamo.es/log-sql-grails-3-app/
quelle
Für einen bestimmten Codeblock können wir auch eine Methode erstellen, die einen Abschluss akzeptiert. z.B.
quelle
Wenn Sie das Konsolen- Plugin installiert haben, können Sie mit diesem kleinen Code-Snippet eine SQL-Protokollierung durchführen.
Dies ist eine Variation vieler der oben genannten Lösungen, ermöglicht es Ihnen jedoch, den Wert zur Laufzeit zu optimieren. Und genau wie bei den anderen Lösungen, die sich damit befassen
logToStdout
, werden nur die Abfragen und nicht die Bindungswerte angezeigt.Die Idee wurde einem Burtbeck mit einem Post gestohlen, den ich vor einigen Jahren gelesen habe und den ich momentan nicht finden kann. Es wurde bearbeitet, um mit Grails 3.3 zu arbeiten.
Eine ähnliche Technik kann verwendet werden, um die Protokollierung für bestimmte Integrationstests zu aktivieren:
Dadurch wird die SQL-Protokollierung nur für die Tests in dieser einen Datei aktiviert.
quelle