2013-06-25 5 views
1

Comment forcer Celery à utiliser un middleware personnalisé afin d'ajouter des informations de débogage supplémentaires et de contrôler le compte email utilisé pour envoyer des emails d'erreur? J'utilise un Django personnalisé middleware pour ajouter des informations de débogage supplémentaires à exceptions et envoyer des e-mails d'erreur. Cela fonctionne parfaitement pour les erreurs standard de Django 500, mais Celery semble ignorer tout le middleware de Django. L'effet est que les erreurs qui se produisent dans Celery ne signalent qu'une traceback très limitée et utilisent la connexion par e-mail par défaut, pas une connexion spéciale utilisée pour signaler des erreurs.Faire Celery utiliser le middleware Django

+0

Pouvez-vous inclure le contenu de '' MIDDLEWARE_CLASSES' de votre settings.py' dans la OP? – Aya

Répondre

0

Vous devez ajouter mail_admins gestionnaire à l'enregistreur de céleri, comme ceci:

LOGGING = { 

... 

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

BTW, j'utilise Sentry pour les erreurs de consignation (à la fois Django et Céleri) et il est sacrément bon!

+0

Cela ne fonctionne tout simplement pas. Je pense que ce que l'affiche originale recherchait était une notification par email sur les erreurs. Pas simplement des retraçages. – rh0dium

1

Céleri n'a pas vraiment d'utilité pour le middleware django, mais cela va accomplir ce que je pense que vous voulez.

Quelque part dans votre lieu de code du gestionnaire de signaux suivant:

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) 

Dans settings.py ajouter ce qui suit

# disable default celery error emails 
CELERY_SEND_TASK_ERROR_EMAILS = False