在 Celery 中使用 Python 标准日志记录
Posted
技术标签:
【中文标题】在 Celery 中使用 Python 标准日志记录【英文标题】:Use Python standard logging in Celery 【发布时间】:2011-10-19 22:30:42 【问题描述】:我必须在预先存在的系统中实现 Celery。之前版本的系统已经使用 Python 标准日志记录。
我的代码类似于下面的代码。进程一和进程二是非 Celery 函数,它们到处都在记录日志。如果发生不好的事情,我们正在使用日志记录来跟踪数据丢失。
@task
def add(x,y):
process_one(x,y)
process_two(x,y)
如何实现 Celery 并使用 Python 标准日志记录而不是 Celery 日志记录,这样我们的旧日志记录系统就不会丢失?
我尝试将 import logging
从 Python 更改为:logger = add.get_logger()
并将 logger
传递给所有函数,但我认为这不是一个好习惯。我需要另一个解决方案。
更新:要在 Celery 日志中添加应用程序日志,您可以执行:
$ manage.py celeryd -v 2 -B -s celery -E -l debug --traceback \
--settings=settings --logfile=/(path to your log folder)/celeryd.log
使用-l
(日志记录)作为debug
,我们的应用程序/Python 日志记录会自动包含在我们的 Celery 日志记录中:无需执行logger = add.get_logger()
。
【问题讨论】:
【参考方案1】:你可能想要这个设置:
CELERYD_HIJACK_ROOT_LOGGER = False
告诉我结果如何。
顺便说一句,它劫持根记录器的原因是因为一些写得不好 图书馆设置日志记录,图书馆不应该做的事情,导致用户体验到 celeryd 没有输出 工人:(
【讨论】:
您好 Asksol,感谢您的回答。是的,我同意你关于图书馆坏事的看法。我已经尝试过 CELERYD_HIJACK_ROOT_LOGGER 的事情。当我咨询我的朋友时,他告诉我让 CELERYD_HIJACK_ROOT_LOGGER = False 是不明智的,因为 celeryd 工人日志记录非常重要且更强大。输出是,celery 只将日志职责从 celery logger 重定向到 root/python logger,结果是一样的。我想如果发生这种情况,我更喜欢使用 celery 记录器而不是 python 记录器。 所以 celery 库设置了日志记录,因为写得不好的库设置了日志记录? ;) 听起来像是“你看起来很麻烦,所以我最好先开枪”的论点。 @hheimbuerger:呵呵,不错。但将 Celery 视为图书馆并不准确。 Celery 是一个分布式任务队列app,你基本上只是配置它(以代码的形式)来完成你想要的。诚然,当与 Django 等其他应用程序集成时,这可能会变得相当混乱。 @hheimbuerger 抱歉,相关性对我来说似乎很清楚,但我会重申。您批评 celery 是一个与作者的声明相矛盾的库,即库不应该设置日志记录。我指出 celery 不是一个库——它是一个 app,所以作者关于日志记录的声明不适用于它。 @Manganeez 好吧,在这种情况下,我将我的声明更改为:“所以 celery 设置了日志记录,因为其他写得不好的软件设置了日志记录。”我的观点仍然成立:celery 含蓄地批评其他软件篡改了日志记录设置。我的问题是芹菜篡改了我的日志记录设置。我觉得这很讽刺。无论您称其为库还是应用程序。以上是关于在 Celery 中使用 Python 标准日志记录的主要内容,如果未能解决你的问题,请参考以下文章