【发布时间】:2012-11-02 05:03:19
【问题描述】:
我正在尝试让 Celery 日志记录与 Django 一起工作。我在settings.py 中进行了日志设置以转到控制台(当我在Heroku 上托管时效果很好)。在每个模块的顶部,我有:
import logging
logger = logging.getLogger(__name__)
在我的 tasks.py 中,我有:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
这可以很好地记录来自任务的调用,我得到如下输出:
2012-11-13T18:05:38+00:00 app[worker.1]: [2012-11-13 18:05:38,527: INFO/PoolWorker-2] Syc feed is starting
但如果该任务随后调用另一个模块中的方法,例如queryset 方法,我得到重复的日志条目,例如
2012-11-13T18:00:51+00:00 app[worker.1]: [INFO] utils.generic_importers.ftp_processor process(): File xxx.csv already imported. Not downloaded
2012-11-13T18:00:51+00:00 app[worker.1]: [2012-11-13 18:00:51,736: INFO/PoolWorker-6] File xxx.csv already imported. Not downloaded
我想我可以使用
CELERY_HIJACK_ROOT_LOGGER = False
只使用Django 日志记录,但是当我尝试它时这不起作用,即使我确实让它工作,我也会失去我想要的"PoolWorker-6" 位。 (顺便说一句,我不知道如何让任务名称显示在 Celery 的日志条目中,因为 the docs 似乎表明它应该这样做)。
我怀疑我在这里遗漏了一些简单的东西。
【问题讨论】:
-
我确实看过。 get_task_logger() 位显然是执行 add.get_logger() 位的新方法
-
啊,确实,我的回答对于 Celery 3.0 来说已经过时了;因为我现在不使用芹菜,所以我没有意识到这一点。 :-)
-
Celery 3.0 使用两个记录器层次结构,有一个
celery记录器,所有其他记录器都继承自(您可以使用celery.utils.get_logger创建一个新记录器,还有一个celery.task记录器,它也继承来自celery记录器,但不会传播到其处理程序,这是因为它具有自定义日志记录格式(它包括任务 ID 等)。如果您手动设置日志记录,您应该使用自定义记录器配置它们celery.task的格式
标签: python django logging celery django-celery