Я использую 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)
Любая помощь будет принята с благодарностью!