Отправка сообщений журнала из всех задач сельдерея в один файл
мне интересно, как настроить более конкретную систему ведения журнала. Все мои задачи используют
logger = logging.getLogger(__name__)
как модульный регистратор.
Я хочу, чтобы сельдерей вошел в "celeryd.войти "и мои задачи в" задачи.журнал " но я понятия не имею, как заставить это работать. Используя CELERYD_LOG_FILE
из django-celery я могу направить все сообщения журнала, связанные с celeryd, в celeryd.журнал, но нет никаких следов сообщений журнала, созданных в моих задачах.
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__)
кроме того, сельдерей регистрирует все выходные данные из задачи. Более подробная информация на сельдерей документы для ведения журнала задач