2009-12-18 12 views
9

Es läuft unter DEBUG = True-Modus. Manchmal kann es eine Fehlermeldung mit Traceback-Informationen werfen, wenn ein Fehler auftritt, aber manchmal nur es die folgenden Zeilen an:Django Unhandled Exception

Unhandled Exception 

An unhandled exception was thrown by the application. 

Ich muß Entwicklungs-Server wechseln Detailmeldung zu sehen.

Wie kann ich die Traceback-Nachricht immer anzeigen lassen, wenn ein Fehler auftritt?

+0

Also die Anzeige des Fehlers ist nicht konsistent, gibt es ein Muster, was Fehler angezeigt werden und was nicht? –

+0

Wie bedienen Sie die Website? Sie sagen unter Nginx, aber ist es FastCGI? –

Antwort

6

Vielleicht können Sie diese Schnipsel verwenden, wird diese Ausnahmen in Log des Apache-Log:

utils.py:

def log_traceback(exception, args): 
    import sys, traceback, logging 
    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() 
    logging.debug(exception) 
    logging.debug(args) 
    for tb in traceback.format_exception(exceptionType, exceptionValue, exceptionTraceback): 
     logging.debug(tb) 

site_logging.py:

import logging 
import sys 

logger = logging.getLogger('') 
logger.setLevel(logging.DEBUG) 
handler = logging.StreamHandler(sys.stderr) 
handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(levelname)-8s %(message)s') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 

Legen Sie es in Ihrem settings.py:

import site_logging 

Und in Ihrem Code:

from where.is.your.utils import log_traceback 
try: 
    `do something` 
except Exception, args: 
    log_traceback(Exception, args) 
1

Das ist, was DEBUG = True ist: um die vollständige Traceback anzuzeigen. Die Idee ist, dass normale Benutzer nichts anderes als eine einfache Fehlermeldung sehen wollen (und sie auch nicht wollen).

+0

Es gibt bestimmte Fehler, die außerhalb der 500-debug-page-Behandlung auftreten, wo Sie immer noch einen rohen Fehler vom Webserver erhalten. –

+0

Ja, ich habe auch bemerkt, dass ich manchmal mod_python Fehlerseiten anstelle der Django Seite bekomme. – JAL

3

Verwenden Sie Apache?
Nur aus Interesse ist dies Ihre Produktion oder Dev-Umgebung, wo Sie die Traceback sehen möchten?

Aus den DJango Book on security - Exposed error messages

Benutzer unter Apache und mod_python implementieren, sollten auch sicherstellen, dass sie PythonDebug Off in ihren Apache conf Dateien haben; Dadurch wird sichergestellt, dass Fehler, die vor dem Laden von Django auftreten, nicht öffentlich angezeigt werden.

Ich nehme an, Sie wollen PythonDebug On, dies wird nur für die Entwicklung empfohlen.

+0

@Ralph, ich benutze Nginx. – jack

+0

ich benutze mod_python mit PythonDebug Off und ich kann immer noch DEBUG = True in meinen Einstellungen um schnell ein Problem zu beheben. Es gibt mir immer noch die handliche Django-Debug-Seite statt der 500 internen Server-Fehlerseite von Apache. –

+0

Entschuldigung, Jack, ich habe Nginx nicht benutzt, also könnte vielleicht jemand mit Nginx bei der Fehlersuche helfen. Brandon - könnte das ein Nginx-spezifischer sein? –

9

Schließen Sie einfach auf das got_request_exception Signal und melden Sie sich die Ausnahme:

from django.core.signals import got_request_exception 
import logging  

def log(*args, **kwargs): 
    logging.exception('error') 

got_request_exception.connect(log) 

Das wird die ganze Spur anmelden. Auf dem Dev-Server meldet er sich in der Konsole an.

Verwandte Themen