【问题标题】:Make Celery use Django exception middleware让 Celery 使用 Django 异常中间件
【发布时间】:2013-06-25 14:55:14
【问题描述】:

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

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

【问题讨论】:

  • 您能否将MIDDLEWARE_CLASSES 的内容从您的settings.py 包含在OP 中?

标签: python django celery django-celery


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该将 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),这非常好!

    【讨论】:

    • 这根本行不通。我认为原始海报正在寻找的是有关错误的电子邮件通知。不仅仅是追溯。
    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2019-03-05
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多