4

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

不知道这里发生了什么,我错过了什么?

感谢任何帮助。谢谢。

4

4 回答 4

5

看来您需要正确获取根记录器:

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()))

输出:

模块 []

模块真

根 []

根真

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

空白 真

于 2017-05-07T06:30:54.503 回答
1

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

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

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

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

谢谢大家,尤其是@falsetru 的帮助。

于 2014-07-13T05:55:52.947 回答
0

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

调用doRollover处理程序将轮换日志文件。

于 2014-07-13T04:07:45.603 回答
0

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

于 2019-02-22T12:43:46.090 回答