是否可以控制 Celery 任务日志的 datefmt?

Is it possible to control the datefmt of the Celery task logs?

对于普通的 python 记录器,您可以像这样配置格式字符串和日期格式:

{                                                                                                     
    'format': '%(asctime)s.%(msecs)d [%(process)d] %(levelname)s [%(name)s] %(message)s',                       
    'datefmt': %d/%m/%Y-%H:%M:%S'                                                                              
}

但我完全找不到任何方法将 datefmt 传递给 Celery 任务记录器。这似乎是一个非常基本的功能,如果它不可能实现,我会感到很惊讶。

我最接近的是遵循 this article 中列出的技术。它的要点是使用 after_setup_task_logger 信号来自定义记录器处理程序以传递自定义 TaskFormatter。但诀窍在于,虽然 TaskFormatter 让你传递格式字符串,但它似乎没有任何规定允许你传递 datefmt.

这似乎被 this open issue 在 Celery github 上证实了。

那么我是否遗漏了什么明显的东西?无需等待芹菜处理上述问题就可以完成的技巧?真的不可能吗?

可以在通过设置 datefmt 属性创建任务格式化程序后设置 datefmt。 Formatter__init__ 就是这样做的。

tf = TaskFormatter('%(asctime)s.%(msecs)d [%(process)d] %(levelname)s [%(name)s] %(message)s')
tf.datefmt = '%d/%m/%Y-%H:%M:%S' 
handler.setFormatter(tf)