logs logrecord loggers log python django exception-handling django-email django-errors

python - logrecord - Activar manualmente el informe de error de correo electrónico Django



loggers django (4)

Principalmente utilizo este patrón con el informe de errores estándar

import logging logger = logging.getLogger(''django.request'') #code block in view try: #code that can raise exception except: logger.exception(''Information'') #continue as nothing happend

Activará el informe de errores integrado y logger.exception capturará el marco de la pila. https://docs.djangoproject.com/en/1.8/topics/logging/#making-logging-calls

editar:

Noté que faltaba información en el correo electrónico y para obtener un rastreo exacto, ya que en su lugar se puede usar lo siguiente:

logger.exception(''Internal Server Error: %s'', request.path, extra={''status_code'': 500, ''request'': request})

Más información encontrada aquí: ¿Cómo enviar el registro de excepciones de django manualmente?

El informe de errores de Django maneja las excepciones no detectadas mediante el envío de un correo electrónico y (opcionalmente) muestra al usuario una bonita página de 500 errores.

Esto funciona muy bien, pero en algunos casos me gustaría permitir que los usuarios continúen con su negocio sin interrupciones, pero aún así Django me envía un informe de error por correo electrónico sobre la excepción.

Básicamente, ¿puedo enviar manualmente un informe de error de correo electrónico incluso si detecto la excepción?

Por supuesto, me gustaría evitar generar manualmente el correo electrónico de informe de error.


Sí, puede enviar manualmente un informe de error por correo electrónico incluso si detecta la excepción.

Hay varias maneras en que puedes hacer esto.

  1. Puede usar la configuración de registrador predeterminada existente (y la configuración de su controlador asociado, documentada here ) para django.request que envía todos los mensajes de error al controlador mail_admins, que envía todo lo registrado con log.error desde django.request cuando la depuración es falsa como correo electrónico utilizando AdminEmailHandler , cuyo punto de llamada existente se encuentra en handle_uncaught_exception .
  2. Puede agregar una configuración de registrador adicional que use el mismo controlador, para capturar su excepción antes que django.request y llamar a log.error antes.
  3. Puede subclase django.request, específicamente handle_uncaught_exception.
  4. Puede usar un middleware personalizado ( por ejemplo, StandardExceptionMiddleware ) o ExceptionMiddleware
  5. Puede llamar manualmente el contenido de AdminEmailHandler en AdminEmailHandler o mail.mail_admins directamente.

De estas opciones, la Opción 4 parece ser la más común.

Basado en la información adicional en su comentario, un ejemplo de código de 2 está debajo.

Primero el código que se añadiría a la vista.

from django.http import HttpResponse import logging logger = logging.getLogger(__name__) def my_view(request): try: result = do_something() return HttpResponse(''<h1>Page was found'' + result + ''</h1>'') except Exception: # Can have whatever status_code and title you like, but I was just matching the existing call. logger.error(''Internal Server Error: %s'', request.path, exc_info=sys.exc_info(), extra={ ''status_code'': 500, ''request'': request } ) return HttpResponse(''<h1>Page was found, and exception was mailed to admins.</h1>'')

Esto se basa en la documentación de Django para la visualización de vistas y en la introducción al registro de Django , pero no se ha probado.

Luego, la configuración del registrador adicional se agrega a la entrada de registradores (como se muestra here )

''nameofdjangoapplicationgoeshere'': { ''handlers'': [''mail_admins''], ''level'': ''ERROR'', ''propagate'': False, },


Simplemente configure un controlador de registro simple en su configuración.

LOGGING = { ''version'': 1, ''disable_existing_loggers'': False, ''filters'': { ''require_debug_false'': { ''()'': ''django.utils.log.RequireDebugFalse'' } }, ''handlers'': { ''mail_admins'': { ''level'': ''ERROR'', ''filters'': [''require_debug_false''], ''class'': ''django.utils.log.AdminEmailHandler'' }, ''app'': { ''level'': ''ERROR'', ''filters'': [''require_debug_false''], ''class'': ''django.utils.log.AdminEmailHandler'' }, }, ''loggers'': { ''django.request'': { ''handlers'': [''mail_admins''], ''level'': ''ERROR'', ''propagate'': True, }, } }

y luego en su opinión, usted puede hacer cualquier cosa

import logging logger = logging.getLogger(''app'') def some_view(request): try: # something if something_wnet_wrong: logger.error(''Something went wrong!'') return some_http_response except: #something else logger.error(sys.exc_info(), request) return some_other_response

Si desea un informe de error detallado, puede intentar algo como esto .

También es necesario cuidar de la información sensible .


Puede usar el siguiente código para enviar manualmente un correo electrónico sobre una request y una excepción e :

import sys import traceback from django.core import mail from django.views.debug import ExceptionReporter def send_manually_exception_email(request, e): exc_info = sys.exc_info() reporter = ExceptionReporter(request, is_email=True, *exc_info) subject = e.message.replace(''/n'', ''//n'').replace(''/r'', ''//r'')[:989] message = "%s/n/n%s" % ( ''/n''.join(traceback.format_exception(*exc_info)), reporter.filter.get_request_repr(request) ) mail.mail_admins( subject, message, fail_silently=True, html_message=reporter.get_traceback_html() )

Puedes probarlo en una vista como esta:

def test_view(request): try: raise Exception except Exception as e: send_manually_exception_email(request, e)