Периодические задачи Celery не запускаются, когда корневой регистратор настроен на использование ворона

Я использую Django с Celery для выполнения периодических задач и Raven в качестве часового клиента.

До сих пор мне удалось запустить несколько приложений с celery beat, и все работало нормально.

По какой-то причине в последнем приложении, над которым я работаю, когда я настраиваю корневой регистратор на использование обработчика 'sentry', периодические задачи не выполняются.

Когда корневой регистратор настраивается на использование только обработчика 'console', он работает.

Я не могу понять, что вызывает эту проблему.

Это мой регистрационный дикт:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'root': {
    'level': os.environ.get('LOG_LEVEL','INFO'),
    'handlers': ['console'],
},
'filters': {
    'require_debug_false': {
        '()': 'django.utils.log.RequireDebugFalse'
    }
},
'handlers': {
    'mail_admins': {
        'level': 'ERROR',
        'filters': ['require_debug_false'],
        'class': 'django.utils.log.AdminEmailHandler'
    },
    'sentry': {
        'level': 'WARNING',
        'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
    },
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
    },
},
'loggers': {
    'django.request': {
        'handlers': ['mail_admins'],
        'level': 'ERROR',
        'propagate': True,
    },
    'raven': {
        'level': 'WARNING',
        'handlers': ['console','sentry'],
        'propagate': True,
    },
    'celery': {
        'handlers': ['console'],
        'level': 'DEBUG',
    },
}

}

И переменная env, управляющая обработчиками корневого логгера:

    ENABLE_SENTRY = os.environ.get('ENABLE_SENTRY', 'FALSE') == 'TRUE'
    if (ENABLE_SENTRY):
        LOGGING['root']['handlers'] = ['console','sentry']

Примечание. Похоже, что корневой регистратор не регистрируется в консоли после этого изменения.

Вот как я запускаю celery beat и worker:

python manage.py celery worker -E -B --maxtasksperchild=1000 --concurrency=10 --loglevel=DEBUG -Ofair

Это часть пакетов, которые я использую:

сельдерей==3.1.17 джанго-сельдерей==3.1.16 ворон==5.0.0 Джанго==1.8.7

Это мой файл celery.py:

"""
This module will hold celery configuration
"""
from __future__ import absolute_import
from django.conf import settings
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE',     'ltg_backend_app.settings')

# init the celery app
app = Celery('ltg_backend_app')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

Любая помощь будет принята с благодарностью!


person OmriToptix    schedule 02.05.2016    source источник
comment
Можете ли вы изменить ['handlers']['sentry']['level'] на то же самое, что и обработчик консоли, и посмотреть, изменит ли это что-нибудь?   -  person Thtu    schedule 04.05.2016
comment
Пробовал. Не помогло.   -  person OmriToptix    schedule 08.05.2016
comment
попробуйте этот вариант: docs.celeryproject.org/ ru/последнее/руководство пользователя/   -  person J. Anderson    schedule 21.01.2018


Ответы (1)


Вы настроили Raven для перехвата необходимых сигналов, необходимых для работы с Celery? вот как я настраиваю свое приложение Celery:

import celery
from django.conf import settings

import raven
from raven.contrib.celery import register_signal, register_logger_signal


class Celery(celery.Celery):
    def on_configure(self):
        #
        # https://docs.sentry.io/clients/python/integrations/celery/
        #
        if 'dsn' in settings.RAVEN_CONFIG and settings.RAVEN_CONFIG['dsn']:
            client = raven.Client(settings.RAVEN_CONFIG['dsn'])
        else:
            client = raven.Client()  # should do nothing

        # register a custom filter to filter out duplicate logs
        register_logger_signal(client)

        # hook into the Celery error handler
        register_signal(client)

app = Celery('foobar')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

см. здесь дополнительные параметры конфигурации и подробности: https://docs.sentry.io/clients/python/integrations/celery/

person matias elgart    schedule 12.11.2016