8

The celery 3.x docs on logging建议像这样设置任务记录器:

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

当我这样做时,CELERYD_TASK_LOG_FORMAT将被忽略并使用日志语句CELERYD_LOG_FORMAT代替,我无法使用%(task_name)sand %(task_id)s

tasks我的任务在我的应用程序的一个模块中myapp。因此,__name__myapp.tasks

我认为问题出在以下几行celery/utils/log.py

def get_task_logger(name):
    logger = get_logger(name)
    if logger.parent is logging.root:
        logger.parent = task_logger
    return logger

因此,无论出于何种原因,传递给的模块get_task_logger()必须是第一级模块,否则不会附加任务记录器。没有评论解释为什么会这样(我想不出你为什么要添加这个限制,真的)。__name__不起作用,因为它引用了二级模块。

我犯了错误还是文档错了?如果是这样,我应该传递给get_task_logger()什么?

4

1 回答 1

2

从 2014 年 10 月 5 日起,情况不再如此。现在通过__name__似乎工作正常(当前实现)。

请记住,您的任务记录器仍将被迫从celery.task. 默认情况下,它的父记录器celery不会传播到根记录器,因此您可能希望celery.task在日志配置中定义一个记录器。

于 2014-10-05T14:21:19.530 回答