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

时间:2021-04-07 17:43:59

标签: python-3.x celery celery-task

我有一个关于如何将 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", "worker", "-l", "info", "--logfile='./tasks.log'"]

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

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

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

1 个答案:

答案 0 :(得分:0)

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