2012-11-08 17 views
5

Ho creato una funzione log_error (request, traceback), che chiamo nelle mie eccezioni. Questo scrive le informazioni di errore nel database. Ora, prima di aprire ognuna delle mie viste e aggiungerlo in un gestore di eccezioni, esiste un modo per far sì che tutte le eccezioni aumentino automaticamente a una funzione, che quindi chiama questo?Python/Django: registra automaticamente quando si verificano eccezioni, incluse le informazioni sulla richiesta

Ho visto questo Python error logging, che dice di scrivere la propria versione di sys.excepthook. Questa funzione viene automaticamente chiamata quando c'è un'eccezione. Ho provato questo, ma my_excepthook non è stato chiamato anche se ho copiato la soluzione in views.py e generato un errore. Tuttavia, non ho provato troppo perché non ho tutte le informazioni di cui ho bisogno, comunque. Ho anche bisogno di una richiesta in modo da poter registrare le informazioni sull'utente, sull'URL, ecc.

Forse è chiedere troppo?

(Sto usando Django, ma questa non sembra una cosa specifica per Django) Modifica: sì, lo è.

+0

'sys.excepthook' viene chiamato solo per le eccezioni non gestite, o quelle che vengono re-sollevate dal gestore, che potrebbe essere il motivo per cui non sembra funzionare quando lo hai provato. Per la maggior parte l'unica informazione che ha è ciò che è passato come argomenti. Potresti memorizzare informazioni aggiuntive da qualche parte e vedere la tua versione lì per lì. – martineau

+0

[Django può essere configurato per segnalare tutte le eccezioni non gestite] (https://docs.djangoproject.com/en/dev/howto/error-reporting/) – jfs

+0

@ J.F. Sebastian. Il modo di errore funziona. Ho scritto una soluzione. Grazie. – user984003

risposta

3

J.F Il suggerimento di Sebastian ha funzionato. Questa è una soluzione Django.

In MIDDLEWARE_CLASSES settings.py:

(.. Ho aggiunto come l'ultimo, non so se questo è giusto o causerà errori su tutta la linea Lavora per ora)

'myapp.middleware.ExceptionMiddleware', 

In myapp.middleware.py:

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

Questo è tutto. log_error è la mia funzione e scrive nel database. Appare anche dalla documentazione https://docs.djangoproject.com/en/dev/howto/error-reporting/ che posso ottenere le variabili locali e gli attributi della richiesta.

+0

Puoi condividere, come è implementata la tua funzione log_error? registrate request.META e traceback sia come due campi di testo (models.TextField)? Grazie – SpiXel

Problemi correlati