古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。

celery 日志设置

Python admin 291℃ 0评论

3种自定义Celery日志记录处理程序的策略

python日志处理程序可以自定义日志消息,例如,我们想把日志消息写入屏幕,文件和日志管理服务等,在这种情况下,我们能将三个日志处理程序添加到应用程序的根记录器中。

在celery 中添加自定义日志处理程序(通常在 celery 中配置日志记录)可能涉及很多麻烦。celery 文档有点少,而且在各种论坛(比如 stackoverflow中也是充满了各种矛盾的答案),各种各样的文章都提出了相当复杂的解决办法和补丁。

在本文,我将展示三种配置 celery 记录器的替代策略,并说明每种策略的工作方式和原因。提供的代码也是可以运行的独立脚本。要求是 python3.6+和 celery4.2.0+结合使用。

首先启动celery

异步方式启动任务

celery logging

celery logging 比较复杂且不易设置。底层的 python 日志记录系统需要支持 celery 支持的所有并发的设置:eventlet,greenlet,threads 等。但现实的情况是现在的 python 日志记录系统并不支持所有这些不同的配置。

celery 在 celery.app.log 中提供了特殊的get_task_logger 功能。这将返回一个继承自记录器celery的特殊记录器 celery.task,该记录器自动获取任务名称以及唯一 ID 作为日志的一部分。

但是,我们也可以使用标准getlogger方式获取日志记录对象,原因是我们很可能在 celery 或者 web 应用程序中调用代码。如果我们使用 logging.getlogger(name),可以使我们的底层代码与执行代码的上下文保持干净整洁。

第一种策略:Augment Celery 记录器

celery 提供了after_setup_logger在Celery设置记录器之后触发的信号,信号传递记录器对象,我们可以方便地自定义处理程序然后添加到记录器中

第二种策略:覆盖 celery 根记录器

可以通过连接setup_logging 信号来阻止celery 配置任何记录器,这样,我们就可以完全自定义自己的日志记录配置

第三种策略:停用 celery 记录器配置

另一种解决方案就是让 celery 设计其记录器但是不使用,并防止其劫持根记录器。默认情况下,celery 会在根记录器上先删除所有先前的配置的处理程序。如果要自定义自己的日志处理程序而不会妨碍celery,则可以通过设置禁用此行为 worker_hijack_root_logger=True。这将使我们能够收回对于根记录器的控制权,并退回到标准的 python 记录器设置。但是需要谨慎使用这种方案,因为我们需要确保python 日志记录与 celery 设置完全兼容(event,greenlet,threads 等)

我们采用第二种方法来定制celery 的日志格式

  • 添加 logging_config
  • 设置 JSON 格式化,并添加 task_id 及 task_name 两个参数
  • 拦截 celery 信号

转载请注明:北凉柿子 » celery 日志设置

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址