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

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

logger = logging.getLogger(__name__) 

как логгер для всего модуля.

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

    Примечание. Этот ответ устарел, как и у Celery 3.0, где теперь вы используете get_task_logger() чтобы настроить свой логгер для каждой задачи. Подробнее см. Раздел «Ведение журнала» в «Что нового в документе Celery 3.0» .


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

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

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

    Доступно несколько уровней ведения журнала, а параметр 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 – False).

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

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

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