Как указано в документации, Celery переопределяет текущую конфигурацию журналирования, чтобы применить свою собственную, а также говорит, что вы можете установить CELERYD_HIJACK_ROOT_LOGGER
в False
в настройках Django, чтобы предотвратить такое поведение, что недостаточно хорошо задокументировано, что этона данный момент не работает.
На мой взгляд, у вас есть 2 варианта:
1. Запретите Celery переопределять вашу конфигурацию (действительно) с помощью сигнала setup_logging
Откройте ваш файл celery.py
и добавьте следующее:
from celery.signals import setup_logging
@setup_logging.connect
def config_loggers(*args, **kwags):
pass
После этого ваш файл должен выглядеть более или менеенапример:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.signals import setup_logging
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@setup_logging.connect
def config_loggers(*args, **kwags):
pass
Однако Я бы не стал использовать эту опцию, если у вас нет веских причин, потому что таким образом вы потеряете ведение журнала заданий по умолчанию, обработанного Celery, что весьма неплохо. иметь.
2. Использовать определенный регистратор
Вы можете определить собственный регистратор в конфигурации Django LOGGING
и использовать его в своей задаче, например:
Настройки Django:
LOGGING = {
# ... other configs ...
'handlers': {
'my_email_handler': {
# ... handler configuration ...
},
},
'loggers': {
# ... other loggers ...
'my_custom_logger': {
'handlers': ['my_email_handler'],
'level': 'CRITICAL',
'propagate': True,
},
},
}
Задачи:
import logging
logger = logging.getLogger('my_custom_logger')
@shared_task
def log():
logger.critical('Something bad happened!')
Я считаю, что это лучший подход для вас, потому что, насколько я понимаю, вам нужно вручную регистрировать сообщения, и это позволяетпродолжать использовать систему лесозаготовок Celery.