Wie kann ich alle SQL-Abfragen protokollieren, die meine Django-Anwendung ausgeführt hat?
Ich möchte alles protokollieren, einschließlich SQLs von der Admin-Site. Ich habe diese Frage und eine FAQ-Antwort gesehen , kann aber immer noch nicht herausfinden, wo ich sie platzieren soll
from django.db import connection
connection.queries
alles in einer Datei protokollieren?
Meine Frage lautet also: Was soll ich tun, um eine Datei (z. B. all-sql.log) zu haben, in der alle SQL-Anweisungen protokolliert werden?
Antworten:
Schauen Sie sich vielleicht https://github.com/django-debug-toolbar/django-debug-toolbar an
Hier können Sie alle Abfragen anzeigen, die von einer bestimmten Seite generiert wurden. Sowie Stapelspuren, wo sie auftreten usw.
BEARBEITEN: Um alle SQL-Abfragen in einer Datei usw. zu protokollieren, müssen Sie eine Middleware erstellen. Middleware wird bei jeder Anforderung ausgeführt. Es gibt mehrere Django-Schnipsel für solche Dinge:
Diese befassen sich mit dem Drucken auf dem Terminal, aber es wäre nicht schwierig, sie für die Verwendung der Protokollierungsbibliothek von Python anzupassen.
quelle
Führen Sie das folgende Snippet mit dem
LOGGING
Feld in Ihrem zusammensettings.py
:Von @ acardenas89 Antwort optimiert
quelle
handlers
Abschnitt Folgendes hinzufügen, falls der Handler "Konsole" nicht hinzugefügt werden kann: Fehler "Konsole" :'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
'version': 1,
imLOGGING
Diktat.DEBUG
aufFalse
, so in Test müssen Sie@override_settings(DEBUG=True)
'propagate': False
nach der'handlers': ['console'],
Zeile hinzufügen , falls Sie einen Root-Logger aktiviert haben und nicht wissen, warum dieser zweimal gedruckt wird. Ich habe ein bisschen gebraucht, um es zu realisieren.Fügen Sie die folgenden fett gedruckten Anweisungen in settings.py hinzu
Ressource / Kredit
quelle
if
Anweisung oben als auch dieLOGGING
Änderungen. Dieif
Anweisung ist für den Fall, dass Sie die Protokollierung hinzufügen möchten, z. B. in der Shell, um sie sofort zu aktivieren - alles, was Sie in settings.py benötigen, sind dieLOGGING
Änderungen - und Sie möchten möglicherweisedjango.db.backends
nicht die sqlite3-spezifische.DEBUG = True
.DEBUG
Einstellung beim Ausführen von Tests auf Falsch gesetzt werden. Eine Problemumgehung besteht darin, es im Test wieder zu aktivierenDjango 1.3 protokolliert alle SQL-Anweisungen in django.db.backends logger :
https://docs.djangoproject.com/de/dev/topics/logging/#django-db-backends
quelle
Um SQL-Abfragen während des Tests zu protokollieren, benötigen Sie zwei Dinge:
django.db.backends
Logger aktiviert und@override_settings(DEBUG=True)
Dekorateur.Der Testläufer setzt standardmäßig DEBUG = False und ignoriert dabei, was Sie möglicherweise in DJANGO_SETTINGS_MODULE festgelegt haben.
Die Mindesteinstellungen:
Der Beispieltestfall:
quelle
Du brauchst nur:
Wenn bereits SQL-Debug-Anweisungen gedruckt sind
runserver
.Fügen Sie den Dekorateur zu Ihrem
class TestA(TestCase)
oder hinzutest_function
:Dank an die Antwort von @Janusz Skonieczny!
quelle
Sie müssen dies in ein Middleware-Paket packen. Die Middleware befindet sich zwischen dem Webserver / Django-Kern und all Ihren Ansichten. Es kann vor der Anforderung eine Vorverarbeitung und nach Abschluss der Anforderung eine Nachverarbeitung durchführen. Speichern Sie beispielsweise die Abfragen in einer Datei.
quelle