2009-12-18 18 views
9

Działa w trybie DEBUG = True. Czasami można go wyrzucić komunikat o błędzie z informacją Traceback gdy wystąpi błąd, ale czasami po prostu wyświetla następujące wiersze:Django Nieobsługiwany wyjątek

Unhandled Exception 

An unhandled exception was thrown by the application. 

muszę przełączyć się na serwerze rozwoju, aby zobaczyć szczegóły wiadomości.

Jak mogę uczynić go zawsze wyświetlać komunikat traceback, gdy wystąpi błąd?

+0

Zatem wyświetlanie błędu nie jest spójne, czy istnieje jakiś wzór na to, jakie błędy są wyświetlane, a co nie? –

+0

W jaki sposób udostępniasz witrynę? Mówisz poniżej Nginx, ale czy to FastCGI? –

Odpowiedz

6

Być może można użyć tego fragmentu, to będą wyjątki zalogować dziennika Apache:

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) 

umieścić go w settings.py:

import site_logging 

I w kodzie:

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

To właśnie DEBUG = True służy do: wyświetlania pełnego śledzenia. Pomysł polega na tym, że zwykli użytkownicy nie chcą (ani nie chcą, aby to robili) widzieli coś innego niż zwykły komunikat o błędzie.

+0

Występują pewne błędy, które występują poza obsługą strony 500-debugowania, w której nadal występuje surowy błąd z serwera WWW. –

+0

Tak, zauważyłem też, że czasami dostaję strony błędów mod_python, a nie stronę Django. – JAL

3

Czy używasz Apache?
Po prostu w interesie jest to twoje środowisko produkcyjne lub deweloperskie, w którym chcesz zobaczyć traceback?

Z DJango Book on security - Exposed error messages

Użytkowników wdrażania pod Apache i mod_python Należy również upewnić się, że mają PythonDebug wyłączyć w swoich plikach conf Apache; to zapewni, że wszelkie błędy, które wystąpią zanim Django miał szansę załadować, nie będą wyświetlane publicznie.

Zakładam, że chcesz PythonDebug On, jest to zalecane tylko do programowania.

+0

@Ralph, używam Nginx. – jack

+0

Używam mod_python z PythonDebug Off i nadal mogę zmienić DEBUG = True w moich ustawieniach, aby szybko rozwiązać problem. Wciąż daje mi przydatną stronę debugowania django zamiast 500 błędów wewnętrznych serwera Apache. –

+0

Przepraszam, Jack, nie używał Nginx, więc może ktoś z Nginx może pomóc w kręceniu zdjęć. Brandon - czy to może być specyficzna dla Nginx? –

9

Wystarczy podłączyć do sygnału got_request_exception i zalogować wyjątek:

from django.core.signals import got_request_exception 
import logging  

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

got_request_exception.connect(log) 

To będzie rejestrować cały ślad. Na serwerze dev loguje się w konsoli.

Powiązane problemy