让Celery使用Django异常中间件



如何强制Celery使用自定义中间件来添加额外的调试信息并控制用于发送错误电子邮件的电子邮件帐户?

我使用一个自定义的Django中间件为异常添加额外的调试信息并发送错误电子邮件。它非常适用于标准Django 500错误,但Celery似乎忽略了所有Django中间件。其效果是,Celery中发生的任何错误都只报告非常有限的回溯,并使用默认的电子邮件连接,而不是用于报告错误的特殊连接。

Celery并没有真正使用django中间件,但这将实现我认为您想要的。

在代码的某个位置放置以下信号处理程序:

from celery.signals import task_failure
from django.core.mail import mail_admins
from django.views.debug import ExceptionReporter

@task_failure.connect
def task_failure_handler(task_id, exception, traceback, einfo, *args, **kwargs):
    exc_info = (einfo.type, exception, traceback)
    reporter = ExceptionReporter(None, *exc_info)
    debug_html = reporter.get_traceback_html()
    debug_text = reporter.get_traceback_text()
    subject = u'Exception - %s' % exception.message
    subject = subject.replace("n", " ")[:250]
    mail_admins(subject, debug_text, html_message=debug_html)

settings.py中添加以下

# disable default celery error emails
CELERY_SEND_TASK_ERROR_EMAILS = False

您应该将mail_admins处理程序添加到芹菜记录器中,如下所示:

LOGGING = {
...
'loggers': {
    'django.request': {
        'handlers': ['mail_admins'],
        'level': 'ERROR',
        'propagate': False,
    },
    'celery': {
        'level': 'INFO',
        'handlers': ['mail_admins'],
        'propagate': True (or False :) ),
    },
...

顺便说一句,我正在使用Sentry记录错误(Django和Celery),它非常好!

最新更新