为什么在芹菜任务后不关闭日志文件

why aren't logging files closed after celery tasks

def fn(filename):
    import logging
    logger = logging.getLogger(filename)
    formatter = logging.Formatter('[%(asctime)s:%(msecs)d], [%(levelname)s], %(message)s, ')
    handler = logging.FileHandler(filename + ".log")
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.error("that's an error")

基本上我只是使用 python 日志库进行日志记录。如果我 运行 它作为一个普通的 python 函数,代码工作正常。

但是如果我在 celery/supervisord 中使用它: fn.delay("loggingFile") 该文件被打开并且永远不会关闭(由 supervisord 中使用的用户)。当然,一段时间后,我打开了数百个文件,这非常糟糕并且会引起其他麻烦。为什么仅 celery 任务会发生这种情况以及如何避免这种情况?

我知道这些文件永远不会关闭,方法是使用 lsof 监视系统以查看哪些用户正在打开哪些文件。

感谢任何帮助

出于某种原因,守护进程没有关闭文件处理程序。您需要在完成记录后手动使用它:

logger.removeHandler(handler)