2009-12-18 18 views
9

Se está ejecutando en DEBUG = True mode. A veces puede tirar un mensaje de error con la información de rastreo cuando se produzca un error, pero a veces simplemente mostrar las siguientes líneas:Django Excepción no controlada

Unhandled Exception 

An unhandled exception was thrown by the application. 

tengo que cambiar a servidor de desarrollo para ver mensaje de detalle.

¿Cómo puedo hacer que siempre muestre el mensaje de rastreo cuando se produce un error?

+0

Entonces, la visualización del error no es consistente, ¿hay algún patrón para ver qué errores se muestran y cuáles no? –

+0

¿Cómo está sirviendo el sitio? Usted dice debajo de Nginx, pero ¿es FastCGI? –

Respuesta

6

Tal vez usted puede utilizar este fragmento, éste registrará excepciones en el registro de 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) 

ponerlo en su settings.py:

import site_logging 

Y en el código:

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

Para eso es DEBUG = True: para mostrar la traza completa. La idea es que los usuarios regulares no quieran (ni quieran que lo hagan) ver nada que no sea un simple mensaje de error.

+0

Hay ciertos errores que ocurren fuera del manejo de 500 páginas de depuración, donde aún se obtiene un error sin formato del servidor web. –

+0

Sí, también me he dado cuenta de que a veces obtengo páginas de error de mod_python en lugar de la página de Django. – JAL

3

¿Estás usando Apache?
¿Le interesa este entorno de producción o desarrollo en el que desea ver la trazabilidad?

De los DJango Book on security - Exposed error messages

usuarios desplegar bajo Apache y mod_python también debe asegurarse de que tienen PythonDebug Off en sus archivos de configuración del Apache; esto asegurará que cualquier error que ocurra antes de que Django tenga la oportunidad de cargarse no se muestre públicamente.

Supongo que quiere PythonDebug On, esto se recomienda solo para desarrollo.

+0

@Ralph, estoy usando Nginx. – jack

+0

estoy usando mod_python con PythonDebug desactivado y aún puedo cambiar DEBUG = True en mi configuración para solucionar rápidamente un problema. Todavía me da la útil página de depuración django en lugar de la página de error del servidor interno 500 de apache. –

+0

lo siento Jack, no he usado Nginx, así que tal vez alguien con Nginx pueda ayudar a solucionar problemas. Brandon: ¿podría ser un Nginx específico? –

9

sólo tiene que conectar a la señal got_request_exception y registrar la excepción:

from django.core.signals import got_request_exception 
import logging  

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

got_request_exception.connect(log) 

Esto registrará toda la traza. En el servidor de desarrollo, inicia sesión en la consola.

Cuestiones relacionadas