Отправка сообщений журнала из всех задач сельдерея в один файл


мне интересно, как настроить более конкретную систему ведения журнала. Все мои задачи используют

logger = logging.getLogger(__name__)

как модульный регистратор.

Я хочу, чтобы сельдерей вошел в "celeryd.войти "и мои задачи в" задачи.журнал " но я понятия не имею, как заставить это работать. Используя CELERYD_LOG_FILE из django-celery я могу направить все сообщения журнала, связанные с celeryd, в celeryd.журнал, но нет никаких следов сообщений журнала, созданных в моих задачах.

2 63

2 ответа:

Примечание: этот ответ устарел по состоянию на сельдерей 3.0, где вы теперь используете get_task_logger() чтобы настроить регистратор для каждой задачи. Пожалуйста, смотрите раздел ведения журнала в документе What's new in Celery 3.0 для сведения.


сельдерей выделил поддержку для ведения журнала, За задачу. Смотрите документация задачи по теме:

вы можете использовать регистратор работников для добавления диагностического выхода к рабочий журнал:

@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y

доступно несколько уровней ведения журнала, и параметр workers loglevel решает будут ли они записаны в файл журнала.

конечно, вы можете также просто использовать печать как что-нибудь написанное к стандарту вне/ - err будет также записывается в файл журнала.

под капотом это все еще стандартный модуль ведения журнала python. Вы можете установить CELERYD_HIJACK_ROOT_LOGGER опции false, чтобы позвольте вашей собственной настройке ведения журнала работать, иначе сельдерей настроит обработку для вас.

однако, для задач,.get_logger() Вызов позволяет настроить отдельный файл журнала для каждой отдельной задачи. Просто пройдите в logfile аргумент и он будет направлять сообщения журнала в этот отдельный файл:

@celery.task()
def add(x, y):
    logger = add.get_logger(logfile='tasks.log')
    logger.info("Adding %s + %s" % (x, y))
    return x + y 

и последнее, но не менее важное, вы можете просто настроить свой пакет верхнего уровня в модуль ведения журнала python и дайте ему собственный обработчик файлов. Я бы поставил это с помощью celery.signals.after_setup_task_logger сигнал; здесь я предполагаю, что все ваши модули живут в пакете под названием foo.tasks (например,foo.tasks.email и foo.tasks.scaling):

from celery.signals import after_setup_task_logger
import logging

def foo_tasks_setup_logging(**kw):
    logger = logging.getLogger('foo.tasks')
    if not logger.handlers:
        handler = logging.FileHandler('tasks.log')
        formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this.
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False

after_setup_task_logger.connect(foo_tasks_setup_logging)

сейчас любой регистратор, чье имя начинается с foo.tasks все это сообщения, отправленные tasks.log вместо корневого регистратора (который не видит этих сообщений, потому что .propagate ложно).

просто подсказка: сельдерей имеет свой собственный обработчик журнала:

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

кроме того, сельдерей регистрирует все выходные данные из задачи. Более подробная информация на сельдерей документы для ведения журнала задач