Registre todos los errores en la consola o archivo en el sitio de Django

votos
13

¿Cómo puedo hacer que Django 1.0 escriba todos los errores en la consola o en un archivo de registro cuando se ejecuta runserver en modo de depuración?

Intenté usar una clase de middleware con la función process_exception como se describe en la respuesta aceptada a esta pregunta:

¿Cómo se registran los errores del servidor en los sitios de django?

Se llama a la función process_exception para algunas excepciones (por ejemplo: assert (False) en views.py) pero process_exception no recibe ningún otro error, como ImportErrors (por ejemplo: import thisclassdoesnotexist in urs.py). Soy nuevo en Django / Python. ¿Esto se debe a alguna distinción entre los errores en tiempo de ejecución y en tiempo de compilación? Pero entonces esperaría que runserver se quejara si se trataba de un error en tiempo de compilación y no es así.

He visto la fantástica presentación de Simon Willison sobre la depuración de Django ( http://simonwillison.net/2008/May/22/debugging/ ) pero no vi una opción que me funcionara bien.

En caso de que sea relevante, estoy escribiendo una aplicación de Facebook y Facebook enmascara errores HTTP 500 con su propio mensaje en lugar de mostrar la increíblemente informativa página de Django. Por lo tanto, necesito una forma para que se escriban todos los tipos de errores en la consola o el archivo.

Editar: supongo que mi expectativa es que si Django puede devolver una página de error 500 con muchos detalles cuando tengo una importación incorrecta (ImportError) en urls.py, debería ser capaz de escribir el mismo detalle en la consola o en un archivo sin tener que agregar cualquier manejo de excepción adicional al código. Nunca he visto el manejo de excepciones en las declaraciones de importación.

Gracias, Jeff

Publicado el 27/03/2009 a las 18:30
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
2

En primer lugar, hay muy pocos errores en tiempo de compilación que verá a través de un registro de excepción. Si su código Python no tiene una sintaxis válida, muere mucho antes de que los registros se abren para la escritura.

En el modo Django runserver, una instrucción "print" escribe en stdout, que puede ver. Sin embargo, esta no es una buena solución a largo plazo, así que no cuentes con ella.

Sin embargo, cuando Django se ejecuta bajo Apache, depende del complemento que estés usando. mod_python no es fácil de tratar. mod_wsgi puede ser forzado a enviar stdout y stderr a un archivo de registro.

Su mejor apuesta, sin embargo, es el módulo de registro . Coloque una inicialización en su nivel superior urls.pypara configurar el registro. (O, tal vez, tu settings.py)

Asegúrese de que cada módulo tenga un registrador disponible para escribir mensajes de registro.

Asegúrese de que cada llamada de servicios web que realice tenga un bloque try / except y escriba las excepciones en su registro.

Respondida el 27/03/2009 a las 19:51
fuente por usuario

votos
13

Es un poco extremo, pero para fines de depuración, puede activar la DEBUG_PROPAGATE_EXCEPTIONSconfiguración. Esto le permitirá configurar su propio manejo de errores. La forma más fácil de configurar dicho manejo de errores sería anular sys.excepthook . Esto terminará su aplicación, pero funcionará. Es posible que haya cosas que puede hacer para que esto no acabe con su aplicación, pero esto dependerá de la plataforma en la que lo esté implementando. En cualquier caso, ¡nunca lo use en producción!

Para la producción, vas a tener que tener un extenso manejo de errores en su lugar. Una técnica que he usado es algo como esto:

>>> def log_error(func):
...     def _call_func(*args, **argd):
...         try:
...             func(*args, **argd)
...         except:
...             print "error" #substitute your own error handling
...     return _call_func
...
>>> @log_error
... def foo(a):
...     raise AttributeError
...
>>> foo(1)
error

Si usa log_error como decorador en su vista, automáticamente manejará cualquier error que haya ocurrido dentro de él.

La _función de excepción de proceso se llama para algunas excepciones (por ejemplo: assert (False) en views.py) pero la _excepción de proceso no se llama para otros errores como ImportErrors (por ejemplo: import thisclassdoesnotexist en urs.py). Soy nuevo en Django / Python. ¿Esto se debe a alguna distinción entre los errores en tiempo de ejecución y en tiempo de compilación?

En Python, todos los errores son errores de tiempo de ejecución. La razón por la cual esto está causando problemas es porque estos errores ocurren inmediatamente cuando se importa el módulo antes de que se llame a su vista. El primer método que publiqué detectará errores como estos para la depuración. Es posible que pueda encontrar algo para la producción, pero yo diría que tiene problemas peores si obtiene ImportErrors en una aplicación de producción (y no realiza ninguna importación dinámica).

Sin embargo, una herramienta como pylint puede ayudarte a eliminar este tipo de problemas.

Respondida el 27/03/2009 a las 20:51
fuente por usuario

votos
-1

Si está en un sistema * nix, podría

escriba en un registro (por ejemplo, mylog.txt) en Python y luego ejecute "tail -f mylog.txt" en la consola

esta es una forma práctica de ver cualquier tipo de inicio de sesión casi en tiempo real

Respondida el 28/03/2009 a las 23:03
fuente por usuario

votos
6

Se llama a la función process_exception para algunas excepciones (por ejemplo: assert (False) en views.py) pero process_exception no recibe ningún otro error, como ImportErrors (por ejemplo: import thisclassdoesnotexist in urs.py). Soy nuevo en Django / Python. ¿Esto se debe a alguna distinción entre los errores en tiempo de ejecución y en tiempo de compilación?

No, es solo porque el middleware process_exception solo se llama si se genera una excepción en la vista .

Creo que DEBUG_PROPAGATE_EXCEPTIONS (mencionado por primera vez por Jason Baker) es lo que necesitas aquí, pero no creo que necesites hacer nada adicional (es decir, sys.excepthook, etc.) si solo quieres que el traceback sea descargado a la consola.

Si desea hacer algo más complejo con el error (es decir, volcarlo en un archivo o DB), el enfoque más simple sería la señal de got_request_exception , que Django envía para cualquier excepción relacionada con la solicitud, ya sea que se haya planteado en la vista o no.

Los métodos get_response y handle_uncaught_exception de django.core.handlers.BaseHandler son instructivos (y breves) en esta área.

sin tener que agregar ningún manejo adicional de excepciones al código. Nunca he visto el manejo de excepciones en las declaraciones de importación.

Mire alrededor un poco más, verá que está hecho (a menudo en los casos en que desea manejar la ausencia de una dependencia de alguna manera particular). Dicho esto, sería bastante feo si tuviera que rociar una prueba adicional, excepto bloques en todo su código para realizar un cambio global en cómo se manejan las excepciones.

Respondida el 30/03/2009 a las 05:53
fuente por usuario

Respondida el 13/11/2009 a las 06:24
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more