3

当我在 Python 2.6 下运行以下代码时

import logging
from logging.handlers import RotatingFileHandler

rfh = RotatingFileHandler("testing.log", delay=True)
logging.getLogger().addHandler(rfh)
logging.warning("Boo!")

然后最后一行抛出AttributeError: RotatingFileHandler instance has no attribute 'level'. 所以我添加了这一行

rfh.setLevel(logging.DEBUG)

在调用 to 之前addHandler,然后最后一行抛出AttributeError: RotatingFileHandler instance has no attribute 'filters'. 因此,如果我手动将过滤器设置为空列表,那么它会抱怨没有属性lock等。

当我删除以将其保留为此处记录delay=True的默认值时,问题就完全消失了。False

我错过了什么吗?如何正确使用类的delay参数RotatingFileHandler

编辑:经过进一步分析(在下面我自己的答案中提出),这看起来像一个错误,但我在Python 错误跟踪器中找不到关于此的错误报告,即使尝试不同的搜索词,所以我想我会报告它。

但是,如果有人可以找到实际的错误报告,那么我可以避免提交重复报告并浪费 Python 开发人员的时间。我将推迟几个小时报告这个错误,如果有人发布了一个包含当前错误报告的答案,那么我会接受这个问题的答案。

4

2 回答 2

5

我已经调查过这个问题:它已在 2009 年 1 月 20 日的 Python SVN r68829 中得到修复。这是在 2.6.1 发布之后但在 2.6.2 发布之前。

请升级到 Python 2.6.2 或更高版本。

我已经更新了你提交的错误。顺便说一句,提交的原始错误报告是#5013,您可以通过搜索所有问题(不仅仅是打开的问题)找到它RotatingFileHandler,就像这样(来自此页面)。

于 2010-03-17T23:44:49.113 回答
0

我想我刚刚想通了:

因此,当设置延迟时,看起来__init__类层次结构中某处的父方法之一没有被调用。事实上,logging/__init__.py在我的 Python 安装中检查文件的源代码,我在方法中看到以下代码FileHandler.__init__

if delay:
    self.stream = None
else:
    stream = self._open()
    StreamHandler.__init__(self, stream)

看起来该FileHandler.emit方法检查未打开的流并在执行日志记录时完成初始化:

if self.stream is None:
    stream = self._open()
    StreamHandler.__init__(self, stream)
StreamHandler.emit(self, record)

所以问题是在BaseRotatingHandler.emit方法中,shouldRolloverdoRollover方法是emit在记录之前调用的。这会导致调用方法,这些方法本身假定该__init__过程已完成。

这看起来像一个错误,所以如果我找不到它已经被报告过,我会报告它。

于 2010-03-17T19:11:10.613 回答