如何将python celery标准日志输出到控制台和日志文件

问题描述

我有一个关于如何将 celery 日志以认格式输出发送到控制台 (stdout) 和日志文件的问题。

log default format: "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s"
task log default format: "[%(asctime)s: %(levelname)s/%(processName)s] 
                          [%(task_name)s(%(task_id)s)] %(message)s"

我使用以下命令启动 celery 应用程序:

celery_app = Clerey()
celery_app.start(argv=["celery","worker","-l","info"]

这只会将完整的 celery 日志发送到控制台 (stdout)。

当我这样做时:

celery_app = Clerey()
celery_app.start(argv=["celery","info","--logfile='./tasks.log'"]

这只会将完整的 celery 日志发送到日志文件 (tasks.log)。

如何将完整的 celery 日志同时发送到控制台和日志文件

我尝试使用 logging.config.dictConfig(config) 来设置 streamHandler 和 fileHandler 以输出到控制台和日志文件。这种方式不允许我在认的 celery 日志格式中包含 task_id 和 task_name,因为 task_id 和 task_name 需要使用 TaskFormatter 类。

解决方法

执行此操作的标准方法是挂钩 celery.signals.setup_loggingcelery.signals.after_setup_task_logger。您可以在信号回调函数中添加额外的日志处理程序。顺便说一句,即使您使用 dictConfig,您仍然可以将 TaskFormatter 添加到您的日志记录配置中。