问题描述
我有一个关于如何将 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_logging
或 celery.signals.after_setup_task_logger
。您可以在信号回调函数中添加额外的日志处理程序。顺便说一句,即使您使用 dictConfig
,您仍然可以将 TaskFormatter
添加到您的日志记录配置中。