write logrecord loggers log python django error-handling error-reporting

python - logrecord - django write log



Cómo acelerar los correos electrónicos de error de Django (5)

Uso el informe de error de django por correo electrónico. Normalmente es una característica muy útil, excepto que ahora tenemos 5 minutos de inactividad de la base de datos y recibí 2000 correos electrónicos. ¿Hay algún middleware que me ayude a reducir el número de correos electrónicos que django puede enviar por minuto?


Supongo que el tiempo de inactividad de la base de datos no fue intencional, en cuyo caso probablemente debió haber puesto su proceso de Django en algún tipo de modo de mantenimiento o desconectado.

De lo contrario, la aplicación de correo habitual es django-mailer, que podría haberlo ayudado simplemente porque almacena el correo saliente en su base de datos y, por lo tanto, habría fallado :)

Si realmente necesita calificar el límite, sería mejor hacerlo en su MTA. Esto podría significar la capacidad de simplemente cerrar la parte del proceso de MTA responsable de enviar correo o algo exótico como usar este parche para qmail para acelerar las conexiones entrantes como un medio para combatir el correo no deseado.


Una opción es cambiar a algo así como ErrorStack para informar errores. Escribí una aplicación django para que sea estúpido: simple de integrar en tu proyecto.


Limité los correos electrónicos a 10 por minuto haciendo lo siguiente. Esto usa una función de conexión redis única para mi instalación. Sugiero modificar la función incr_counter para adaptarla a sus necesidades. Para estar seguro, use una redis directa o una conexión de Memcache para esto y no cualquier envoltorio django.cache.

settings.py

LOGGING = { ''version'': 1, ''disable_existing_loggers'': False, ''handlers'': { ''mail_admins'': { ''level'': ''ERROR'', ''class'': ''error_email_limiter.handler.MyAdminEmailHandler'' } }, ''loggers'': { ''django.request'': { ''handlers'': [''mail_admins''], ''level'': ''ERROR'', ''propagate'': True, }, } }

error_email_limiter / handlers.py

class MyAdminEmailHandler(AdminEmailHandler): def incr_counter(self): c = get_redis_connection() key = self._redis_key() res = c.incr(key) c.expire(key, 300) return res def _redis_key(self): return time.strftime(''error_email_limiter:%Y-%m-%d_%H:%M'', datetime.datetime.now().timetuple()) def emit(self, record): try: ctr = self.incr_counter() except Exception: pass else: if ctr >= 10: return super(MyAdminEmailHandler, self).emit(record)


Usando la excelente respuesta de Gattster como ejemplo, escribí una implementación simple basada en las funciones de caché integradas de django.

# -*- coding: utf-8 -*- from django.utils.log import AdminEmailHandler from django.core.cache import cache class ThrottledAdminEmailHandler(AdminEmailHandler): PERIOD_LENGTH_IN_SECONDS = 10 MAX_EMAILS_IN_PERIOD = 1 COUNTER_CACHE_KEY = "email_admins_counter" def increment_counter(self): try: cache.incr(self.COUNTER_CACHE_KEY) except ValueError: cache.set(self.COUNTER_CACHE_KEY, 1, self.PERIOD_LENGTH_IN_SECONDS) return cache.get(self.COUNTER_CACHE_KEY) def emit(self, record): try: counter = self.increment_counter() except Exception: pass else: if counter > self.MAX_EMAILS_IN_PERIOD: return super(ThrottledAdminEmailHandler, self).emit(record)

Y la configuración de registro también se ha cambiado en Django 1.9, por lo que para que este controlador funcione, debe configurar el registro como:

LOGGING = { ''version'': 1, ''disable_existing_loggers'': True, ''handlers'': { ''mail_admins'': { ''level'': ''ERROR'', ''class'': ''fully.qualified.path.to.handler.ThrottledAdminEmailHandler'' } }, ''loggers'': { ''django'': { ''handlers'': [''mail_admins''], ''level'': ''ERROR'', ''propagate'': True, }, } }

donde el cambio es solo para cambiar el nombre del registrador de django.request a django . Si observa la documentación del sistema de registro, esto probablemente podría lograrse de una manera más limpia (?) Mediante la implementación de un filtro de registro .