Wenn ich also mit der Entwicklung spiele, kann ich einfach festlegen settings.DEBUG
, True
und wenn ein Fehler auftritt, kann ich sehen, dass sie gut formatiert ist, mit guter Stapelverfolgung und Anforderungsinformationen.
Aber auf einer Art Produktionsstätte würde ich lieber DEBUG=False
eine Standardfehler-500-Seite mit Informationen verwenden und anzeigen, an denen ich gerade arbeite, um diesen Fehler zu beheben;)
Gleichzeitig möchte ich eine Möglichkeit haben, alle zu protokollieren Diese Informationen (Stapelverfolgung und Anforderungsinformationen) werden in eine Datei auf meinem Server übertragen. Ich kann sie also einfach auf meiner Konsole ausgeben und Fehler beim Scrollen beobachten, das Protokoll jede Stunde per E-Mail an mich senden oder so etwas.
Welche Protokollierungslösungen würden Sie für eine Django-Site empfehlen, die diese einfachen Anforderungen erfüllt? Ich habe die Anwendung als fcgi
Server ausgeführt und verwende Apache-Webserver als Frontend (obwohl ich daran denke, auf lighttpd zu gehen).
quelle
Antworten:
Nun, wenn
DEBUG = False
, Django wird automatisch eine vollständige Rückverfolgung aller Fehler an jede in derADMINS
Einstellung aufgeführte Person senden, wodurch Sie so gut wie kostenlos benachrichtigt werden. Wenn Sie eine genauere Steuerung wünschen, können Sie eine Middleware-Klasse schreiben und zu Ihren Einstellungen hinzufügen, die eine Methode mit dem Namen definiertprocess_exception()
, die Zugriff auf die Ausnahme hat, die ausgelöst wurde:http://docs.djangoproject.com/de/dev/topics/http/middleware/#process-exception
Ihre
process_exception()
Methode kann dann jede Art von Protokollierung durchführen, die Sie möchten: Schreiben in die Konsole, Schreiben in eine Datei usw. usw.Bearbeiten: Obwohl es etwas weniger nützlich ist, können Sie auch auf das
got_request_exception
Signal warten, das gesendet wird, wenn während der Anforderungsverarbeitung eine Ausnahme auftritt:http://docs.djangoproject.com/de/dev/ref/signals/#got-request-exception
Dadurch erhalten Sie jedoch keinen Zugriff auf das Ausnahmeobjekt, sodass die Middleware-Methode viel einfacher zu handhaben ist.
quelle
logging.exception('Some message')
mit dem Standardprotokollierungsmodul von Python in einem Sginal-Handler einwandfrei funktioniertgot_request_exception
, wenn Sie nur Stack-Traces abmelden möchten . Mit anderen Worten, der Traceback ist weiterhin in verfügbargot_request_exception
.Django Sentry ist, wie bereits erwähnt, ein guter Weg, aber es ist ein wenig Arbeit erforderlich, ihn ordnungsgemäß einzurichten (als separate Website). Wenn Sie nur alles in einer einfachen Textdatei protokollieren möchten, finden Sie hier die Protokollierungskonfiguration, die Sie in Ihre Datei einfügen können
settings.py
quelle
'include_html': True
macht die E-Mails NICHT einfach "schöner"! Es enthält einen vollständigen Traceback, einschließlich der Werte von Einstellungen und lokalen Variablen. Lautdjango-db-log, in einer anderen Antwort erwähnt, wurde ersetzt durch:
https://github.com/dcramer/django-sentry
quelle
Natürlich hat James Recht, aber wenn Sie Ausnahmen in einem Datenspeicher protokollieren möchten, sind bereits einige Open Source-Lösungen verfügbar:
1) CrashLog ist eine gute Wahl: http://code.google.com/p/django-crashlog/
2) Db-Log ist ebenfalls eine gute Wahl: http://code.google.com/p/django-db-log/
Was ist der Unterschied zwischen den beiden? Fast nichts, was ich sehen kann, also wird beides ausreichen.
Ich habe beide benutzt und sie funktionieren gut.
quelle
Seit der hilfreichsten Codeübermittlung von EMP ist einige Zeit vergangen. Ich habe es gerade implementiert, und während ich mit einer Option "manage.py" herumwirbelte, um zu versuchen, einen Fehler zu beseitigen, erhielt ich eine Verwerfungswarnung dahingehend, dass mit meiner aktuellen Version von Django (1.5.?) Jetzt ein require_debug_false-Filter vorhanden ist wird für den mail_admins-Handler benötigt.
Hier ist der überarbeitete Code:
quelle
Ich hatte gerade ein nerviges Problem mit meinem
fcgi
Skript. Es geschah, bevor Django überhaupt anfing. Der Mangel an Protokollierung ist sooo schmerzhaft. Auf jeden Fall hat es sehr geholfen, stderr als erstes in eine Datei umzuleiten:quelle