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

问题描述 投票:4回答:4

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

不知道这里发生什么,我遗失的任何陷阱?

感谢任何帮助。谢谢。

python windows logging logrotate log-rotation
4个回答
3
投票

您似乎需要正确获取根记录器:

logger = logging.getLogger(__name__)
handlers = logger.handlers[:]
print('module {}'.format(handlers))
print('module {}'.format(logger.hasHandlers()))

logger = logging.getLogger('root')
handlers = logger.handlers[:]
print('root {}'.format(handlers))
print('root {}'.format(logger.hasHandlers()))

logger = logging.getLogger()
handlers = logger.handlers[:]
print('blank {}'.format(handlers))
print('blank {}'.format(logger.hasHandlers()))

输出:

模块[]

模块真的

根 []

root真的

空白的[<logging.handlers.RotatingFileHandler object at 0x108d82898>, <logging.StreamHandler object at 0x108d826d8>]

空白真的


1
投票

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

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

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

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

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


0
投票

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

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


0
投票

也许没有'TimeRoatingFileHandler'这样的名字,因为你在'Timed'这个词中错过了'd'。所以一定是:'TimedRoatingFileHandler'

© www.soinside.com 2019 - 2024. All rights reserved.