Сделать Celery использовать промежуточное программное обеспечение исключения Django

Как заставить Celery использовать специализированное промежуточное программное обеспечение, чтобы добавить дополнительную информацию об отладке и контролировать учетную запись электронной почты, используемую для отправки сообщений об ошибках?

Я использую настраиваемое промежуточное программное обеспечение Django для добавления дополнительной информации об отладке в исключения и отправки сообщений об ошибках. Он отлично работает для стандартных ошибок Django 500, но Celery, похоже, игнорирует все межсоединения Django. Эффект заключается в том, что любые ошибки, которые происходят в Celery, сообщают только о очень ограниченной трассировке и используют почтовое соединение по умолчанию, а не специальное соединение, используемое для сообщений об ошибках.

2 ответа

Сельдерей на самом деле не пользуется промежуточным программным обеспечением 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), и это чертовски хорошо!

licensed under cc by-sa 3.0 with attribution.