Por lo tanto, cuando se juega con el desarrollo que sólo puede fijar settings.DEBUG
a True
y si un error occures lo puedo ver con un formato agradable, con buena traza de pila y solicitar información.
Pero en el tipo de sitio de producción prefiero usar DEBUG=False
y mostrar a los visitantes un error estándar de 500 páginas con información que estoy trabajando para solucionar este error en este momento;)
Al mismo tiempo, me gustaría tener alguna forma de registrar todo esa información (seguimiento de la pila e información de solicitud) a un archivo en mi servidor, por lo que puedo enviarla a mi consola y ver cómo se desplazan los errores, enviarme el registro por correo electrónico cada hora o algo así.
¿Qué soluciones de registro recomendaría para un sitio django que cumpla con esos requisitos simples? Tengo la aplicación ejecutándose como fcgi
servidor y estoy usando un servidor web apache como interfaz (aunque estoy pensando en ir a lighttpd).
fuente
Respuestas:
Bueno, cuando
DEBUG = False
, Django enviará automáticamente un seguimiento completo de cualquier error a cada persona enumerada en laADMINS
configuración, lo que le dará notificaciones de forma gratuita. Si desea un control más detallado, puede escribir y agregar a su configuración una clase de middleware que defina un método llamadoprocess_exception()
, que tendrá acceso a la excepción que se generó:http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
Su
process_exception()
método puede realizar cualquier tipo de registro que desee: escribir en la consola, escribir en un archivo, etc., etc.Editar: aunque es un poco menos útil, también puede escuchar la
got_request_exception
señal, que se enviará cada vez que se encuentre una excepción durante el procesamiento de la solicitud:http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception
Sin embargo, esto no le da acceso al objeto de excepción, por lo que es mucho más fácil trabajar con el método de middleware.
fuente
logging.exception('Some message')
con el módulo de registro estándar de Python funciona bien en un controlador marginal paragot_request_exception
, si todo lo que está buscando hacer es cerrar sesión en los rastros de la pila. En otras palabras, el rastreo aún está disponible engot_request_exception
.Django Sentry es un buen camino a seguir, como ya se mencionó, pero hay un poco de trabajo involucrado en configurarlo correctamente (como un sitio web separado). Si solo desea registrar todo en un archivo de texto simple, aquí está la configuración de registro para poner en su
settings.py
fuente
'include_html': True
¡NO simplemente hace que los correos electrónicos sean "más agradables"! Incluye un rastreo completo, incluidos los valores de configuración y variables locales. Según los documentos, este es un problema de seguridad: docs.djangoproject.com/en/1.8/topics/logging/…django-db-log, mencionado en otra respuesta, ha sido reemplazado por:
https://github.com/dcramer/django-sentry
fuente
Obviamente, James tiene razón, pero si desea registrar excepciones en un almacén de datos, ya hay algunas soluciones de código abierto disponibles:
1) CrashLog es una buena opción: http://code.google.com/p/django-crashlog/
2) Db-Log también es una buena opción: http://code.google.com/p/django-db-log/
¿Cuál es la diferencia entre los dos? Casi nada de lo que puedo ver, por lo que cualquiera será suficiente.
He usado ambos y funcionan bien.
fuente
Ha pasado algún tiempo desde el envío de código más útil de EMP. Acabo de implementarlo, y mientras intentaba con alguna opción manage.py, para tratar de perseguir un error, recibí una advertencia de desaprobación en el sentido de que con mi versión actual de Django (1.5.?) Un filtro require_debug_false ahora es necesario para el manejador mail_admins.
Aquí está el código revisado:
fuente
Acabo de tener un problema molesto con mi
fcgi
script. Ocurrió incluso antes de que django comenzara. La falta de registro es tan dolorosa. De todos modos, redirigir stderr a un archivo como lo primero ayudó mucho:fuente