在 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 标准日志记录的主要内容,如果未能解决你的问题,请参考以下文章

Python Celery - 忽略日志级别信息的工作人员

Celery Logging:在任务内外记录的一致方式

Celery Python 日志记录配置仅从指定模块记录 DEBUG

如何为 celery 任务日志指定文件路径?

Celery 周期任务运行一段时间后意外停止

如何在 Celery 任务执行期间强制执行记录器格式?