2015-12-12 7 views
2

Я использую Django-RQ в приложении Heroku для обработки фоновых задач.Отправка исключений Django-RQ в Sentry

При возникновении ошибки в моих фоновых задачах она не отправляется в Sentry.

Мои настройки протоколирования в settings.py ниже:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'root': { 
     'level': 'WARNING', 
     'handlers': ['sentry'], 
    }, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'formatters': { 
     'verbose': { 
      'format': '%(levelname)s %(asctime)s %(module)s ' 
         '%(process)d %(thread)d %(message)s' 
     }, 
     "rq_console": { 
      "format": "%(asctime)s %(message)s", 
      "datefmt": "%H:%M:%S", 
     }, 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     }, 
     "rq_console": { 
      "level": "DEBUG", 
      "class": "rq.utils.ColorizingStreamHandler", 
      "formatter": "rq_console", 
      "exclude": ["%(asctime)s"], 
     }, 
     'sentry': { 
      'level': 'ERROR', 
      'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler' 
     }, 
     'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'formatter': 'verbose' 
     } 
    }, 
    'loggers': { 
     'django.db.backends': { 
      'level': 'ERROR', 
      'handlers': ['console'], 
      'propagate': False, 
     }, 
     'raven': { 
      'level': 'DEBUG', 
      'handlers': ['console'], 
      'propagate': False, 
     }, 
     'sentry.errors': { 
      'level': 'DEBUG', 
      'handlers': ['console'], 
      'propagate': False, 
     }, 
     "rq.worker": { 
      "handlers": ["rq_console", "sentry"], 
      "level": "DEBUG" 
     }, 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    }, 
} 

Цените какие-либо советы о том, что я делаю неправильно.

ответ

5

Вам нужно будет разработать пользовательский рабочий и зарегистрировать обработчик часов с помощью python-rq.

Я предполагаю, что вы используете rq.Worker как рабочий класс (по умолчанию для django-rq).

import rq 
from raven import Client 
from raven.transport import HTTPTransport 
from rq.contrib.sentry import register_sentry 

class SentryAwareWorker(rq.Worker): 

    def __init__(self, *args, **kwargs): 
     super(SentryAwareWorker, self).__init__(*args, **kwargs) 
     dsn = settings.RAVEN_CONFIG['dsn'] 
     client = Client(dsn, transport=HTTPTransport) 
     register_sentry(client, self) 

я представляю возможность получить часовые dsn и для инициализации клиента сторожевого, но вы можете сделать это, как вы. Важная часть - .

Затем запустите ваш рабочий с:

python manage.py rqworker queue_1 queue_2 queue_n --worker-class path.to.SentryAwareWorker