2011-05-04 34 views
17

lo hice un poco de búsqueda, pero me pregunto si alguien tiene un fragmento de una configuración de registro para llegar a Django que acaba de emitir un seguimiento de la pila a la salida estándar (para que pueda verlo en la ventana de Terminal) cuando encuentra un error durante una solicitud. Esto es específicamente para el desarrollo/depuración local y principalmente para cuando hago solicitudes de publicación AJAX y tengo que mirar el HTML en Firebug para descubrir en qué línea ocurrió el error.Imprimir un seguimiento de pila a la salida estándar de errores en Django durante el uso de manage.py runserver

+0

"Terminal Window"? ¿Estás ejecutando 'django-admin.py runserver'? –

+0

Sí, 'manage.py runserver' localmente, pero esto sería útil también para la producción, aunque allí recibo correos electrónicos, por lo que no es un problema. – Bialecki

+0

el enfoque de "producción" depende de cómo se integre con Apache, por lo que deberá proporcionar aún más detalles sobre esa configuración para asegurarse de que comprendamos. –

Respuesta

20

Se puede crear una pieza de middleware para hacer esto. He aquí un fragmento modificado que estoy usando para un proyecto:

class ExceptionLoggingMiddleware(object): 
    def process_exception(self, request, exception): 
     import traceback 
     print traceback.format_exc() 

lugar este controlador en su parte middleware de la configuración de Django.

0

Subclase WSGI controlador, haga lo que desee con traceback en su handle_uncaught_exception definido, y use su WSGIHandler en lugar del proporcionado por django durante la implementación.

import traceback 
from django.core.handlers.wsgi import WSGIHandler 

class MyWSGIHandler(WSGIHandler): 
    """WSGI Handler which prints traceback to stderr""" 
    def handle_uncaught_exception(self, request, resolver, exc_info): 
     traceback.print_tb(exc_info[2], file=sys.stderr) 
     return super(WSGIHandler, self).handle_uncaught_exception(request, resolver, exc_info) 

Se utiliza con Apache/mod_wsgi, esto debe escribir el rastreo, en el registro de errores de Apache

24

Otro método es con TALA. En concreto se obtiene una StackTrace cuando se ejecuta ./manage.py runserver añadiendo lo siguiente a la settings.py archivo:

LOGGING = { 
    'version': 1, 
    'handlers': { 
     'console':{ 
      'level':'DEBUG', 
      'class':'logging.StreamHandler', 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers':['console'], 
      'propagate': True, 
      'level':'DEBUG', 
     } 
    }, 
} 

Esta sintaxis viene de la documentación de Django Configuring Logging y puede ser modificado adicionalmente para aumentar o disminuir la cantidad de consola- explotación florestal.

También las 5XX respuestas son criados como mensajes de error y 4XX respuestas son criados como mensajes de advertencia.

Tenga en cuenta que esta pregunta & respuesta tiene un 2013 duplicado here.

+3

Este debería ser el método preferido en mi opinión. Usted tiene mucho más control sobre qué registradores desea utilizar, qué desea registrar, etc. – Andre

0

que tenía un problema similar, pero la opción de middleware no me ayuda. La razón es que estoy usando django-jsonview 0.4.3, que proporciona un decorador que convierte un diccionario en una respuesta http json válida, incluso cuando la función decorada falla, por lo que nunca se llama al método process_exception middleware. He comprobado el código de este decorador y parece que se trata de registrar el error de hacer esto:

... 
except Exception as e: 
    logger = logging.getLogger('django.request') 
    logger.exception(unicode(e)) 

Sin embargo, no sé por qué, esto no está funcionando y no se registra nada en mi consola bash. Debería descubrir por qué sucede esto. Mientras tanto, estoy usando un decorador extra:

def log_errors(func): 
    if not settings.DEBUG: 
     return func 

    def wrapper(request, *args, **kwargs): 
     try: 
      return func(request, *args, **kwargs) 
     except: 
      print traceback.format_exc() 
    return wrapper 

Luego, en todos mis puntos de vista JSON:

@json_view 
@log_errors 
def my_view(request): 
    .... 
1

que suelen utilizar esto:

except Exception,e: 
     # Get line 
     trace=traceback.extract_tb(sys.exc_info()[2]) 
     # Add the event to the log 
     output ="Error in the server: %s.\n" % (e) 
     output+="\tTraceback is:\n" 
     for (file,linenumber,affected,line) in trace: 
      output+="\t> Error at function %s\n" % (affected) 
      output+="\t At: %s:%s\n" % (file,linenumber) 
      output+="\t Source: %s\n" % (line) 
     output+="\t> Exception: %s\n" % (e) 

Luego uso "de salida "para todo lo que necesita: imprimir a la salida estándar, envíe un correo electrónico, etc ...

11

Es de San rango nadie mencionó la configuración DEBUG_PROPAGATE_EXCEPTIONS.No es para producción, pero es muy fácil de usar en entornos de prueba/depuración. Simplemente agregue a settings.py:

DEBUG_PROPAGATE_EXCEPTIONS = True 
+1

Exactamente esta parece la respuesta más adecuada :) – sudhanshu

+0

+1 por lo que vale la pena, después de un par de horas depurando un problema DRF y sin más pruebas/opciones para probar, literalmente salvaste mi día ... – jliendo

+0

Esto definitivamente debería ser la respuesta aceptada, ¡muchas gracias! –

Cuestiones relacionadas