记录处理程序为空 - 为什么记录TimeRoatingFileHandler不起作用

时间:2014-07-13 03:59:42

标签: python windows logging logrotate log-rotation

所以我做logging.config.fileConfig从具有控制台和文件处理程序的文件配置中设置我的日志记录。然后我做logging.getLogger(name)来获取我的记录器和日志。在某些时候,我希望文件处理程序的文件名更改即日志旋转(由于Windows平台的一些问题,我不能使用时间旋转器)所以要做到这一点我调用logger.handlers - 它显示一个空列表,所以我不能关闭他们!然而,当我单步执行调试器时,它显然不是空的(当然没有它,我就不能正确记录)

不确定这里发生了什么,我遗失的任何陷阱?

感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:1)

首先问题是,如果您使用配置文件初始化使用文件和控制台处理程序的日志记录,那么它不会填充logging.handlers列表,因此您无法迭代它并在打开之前关闭+刷新流新的日志文件名。

如果你想使用TimeRotatingFileHandler或RotatingFileHandler,它就位于logging / handler.py下,当它尝试进行翻转时,它只会关闭自己的流,因为它不知道父日志的流是什么(主要是单例)班级可能已开放。所以当你进行翻转时,会有一个文件锁(文件文件处理程序)并且它都会失败。

所以解决方案(对我来说)是以编程方式初始化日志记录并在日志记录中使用addHandlers,它还会填充logging.handlers [],然后我用它来迭代我的控制台/文件处理程序并在手动旋转之前关闭它们文件。

对我来说,这看起来像是一个明显的日志类错误,如果它在unix上工作 - 它真的不应该。

谢谢大家,特别是@falsetru的帮助。

答案 1 :(得分:0)

您可以使用RotatingFileHandler(不是TimedRotatingFileHandler)。

调用处理程序的doRollover将旋转日志文件。

答案 2 :(得分:0)

也许没有“ TimeRoatingFileHandler”这样的名称,因为您错过了“ Timed”一词中的“ d”。因此它必须是:'TimedRoatingFileHandler'