您如何强制 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
处理程序添加到 celery 记录器,如下所示:
LOGGING = {
...
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'celery': {
'level': 'INFO',
'handlers': ['mail_admins'],
'propagate': True (or False :) ),
},
...
顺便说一句,我正在使用Sentry来记录错误(Django 和 Celery),这非常好!