Примечание. Этот ответ устарел в Celery 3.0, где теперь вы используете get_task_logger()
, чтобы настроить журнал для каждой задачи. См. раздел «Ведение журнала» документа «Что нового в Celery 3.0». для получения дополнительной информации.
В Celery есть специальная поддержка ведения журнала для каждой задачи. См. документацию по заданию по этой теме:
Вы можете использовать журнал рабочих процессов, чтобы добавить диагностические данные в журнал рабочих процессов:
@celery.task()
def add(x, y):
logger = add.get_logger()
logger.info("Adding %s + %s" % (x, y))
return x + y
Доступно несколько уровней ведения журнала, и настройка уровня журнала рабочих решает, будут ли они записаны в файл журнала.
Конечно, вы также можете просто использовать print, поскольку все, что написано в стандартном out / -err, также будет записано в файл журнала.
Под капотом это все еще стандартный модуль ведения журнала Python. Вы можете установить для параметра CELERYD_HIJACK_ROOT_LOGGER
значение Значение false, чтобы разрешить работу вашей собственной настройки ведения журнала, в противном случае Celery настроит обработку за вас.
Однако для задач вызов .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
имеет значение False).
person
Martijn Pieters
schedule
31.05.2011