2012-11-08 9 views
5

Ich habe eine Funktion log_error (Anfrage, Traceback) erstellt, die ich in meinen Ausnahmen aufrufen. Dies schreibt Fehlerinformationen in die Datenbank. Nun, bevor ich alle meine Ansichten öffne und dies in einem Exception-Handler hinzufüge, gibt es eine Möglichkeit, automatisch alle Exceptions auf eine Funktion zu erhöhen, die dann diese aufruft?Python/Django: automatisch protokollieren, wenn Ausnahmen auftreten, einschließlich Anfrage Info

Ich habe dieses Python error logging gesehen, das sagt, um Ihre eigene Version von sys.excepthook zu schreiben. Diese Funktion wird automatisch aufgerufen, wenn eine Ausnahme vorliegt. Ich habe das versucht, aber my_excepthook wurde nicht aufgerufen, obwohl ich die Lösung in views.py kopiert und einen Fehler ausgegeben habe. Ich habe mich jedoch nicht zu sehr bemüht, weil es sowieso nicht alle Informationen bekommt, die ich brauche. Ich brauche auch Anfrage, damit ich Informationen über den Benutzer, URL, etc. protokollieren kann.

Vielleicht fragt das zu viel?

(Ich benutze Django, aber das scheint nicht wie eine Django-spezifische Sache) Edit: Ja, ist es.

+0

"sys.excepthook" wird nur für nicht behandelte Ausnahmen oder solche, die von ihrem Handler erneut ausgelöst werden, aufgerufen. Das könnte der Grund sein, warum es beim Versuch nicht funktionierte. Zum größten Teil ist die einzige Information, die es hat, was es als Argumente übergeben hat. Du könntest zusätzliche Informationen irgendwo speichern und deine Version dort dort suchen lassen. – martineau

+0

[Django kann so konfiguriert werden, dass alle nicht behandelten Ausnahmen gemeldet werden] (https://docs.djangoproject.com/en/dev/howto/error-reporting/) – jfs

+0

@ J.F. Sebastian. Der Fehler Weg funktioniert. Ich habe eine Lösung geschrieben. Vielen Dank. – user984003

Antwort

3

J.F Sebastian Vorschlag funktioniert. Dies ist eine Django-Lösung.

In settings.py MIDDLEWARE_CLASSES:

(.. Ich es als die letzten hinzugefügt, nicht sicher, ob das richtig ist oder werden Fehler auf der ganzen Linie führt Werke für jetzt) ​​

'myapp.middleware.ExceptionMiddleware', 

In myapp.middleware.py:

import traceback 
class ExceptionMiddleware(object): 
    def process_exception(self, request, exception): 
     log_error(traceback, request) 

Das ist es. log_error ist meine Funktion und schreibt in die Datenbank. Es erscheint auch aus der Dokumentation https://docs.djangoproject.com/en/dev/howto/error-reporting/, dass ich die lokalen Variablen sowie die Anfrage Attribute erhalten kann.

+0

Können Sie bitte teilen, wie ist Ihre log_error Funktion implementiert? protokollieren Sie request.META und traceback als zwei TextFields (models.TextField)? Vielen Dank – SpiXel

Verwandte Themen