Задачи Celery не отправляют письмо администраторам на критические сообщения регистратора - PullRequest
5 голосов
/ 21 октября 2019

Мои задачи из сельдерея не отправляют электронное письмо администраторам приложения каждый раз, когда я вызываю logger.critical.

Я создаю приложение Django. Текущая конфигурация моего проекта позволяет администраторам приложения получать электронную почту каждый раз, когда создается сообщение logger.critical. Это было довольно просто настроить, я просто следовал документации по обоим проектам (сельдерей и Django). По какой-то причине, которую я не понимаю, код, который запускается внутри задачи celery, не имеет такого поведения. Он не отправляет электронное письмо администратору приложения каждый раз, когда создается сообщение logger.critical.

Действительно ли сельдерей вообще позволяет это сделать? Я что-то пропустил? Кто-нибудь получил эту проблему и смог ее решить?

Использование:

  • Джанго 1,11
  • Сельдерей 4,3

Спасибо за любую помощь.

Ответы [ 2 ]

5 голосов
/ 15 ноября 2019

Как указано в документации, 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.

0 голосов
/ 08 ноября 2019

Из документов Celery:

По умолчанию все ранее настроенные обработчики в корневом логгере будут удалены. Если вы хотите настроить свои собственные обработчики журналов, то вы можете отключить это поведение, установив worker_hijack_root_logger = False.

Celery устанавливает собственный регистратор, который вы можете получить с помощью вызова get_task_logger(). Я предполагаю, что вы написали свой собственный логгер, который соответствует логике, описанной вами в первоначальном вопросе. Прочитайте больше о Запись сельдерея , чтобы узнать, как отключить это поведение и настроить Celery под свои нужды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...