【问题标题】:RotatingFileHandler throws an exception when delay parameter is set设置延迟参数时,RotatingFileHandler 抛出异常
【发布时间】:2011-01-28 17:38:00
【问题描述】:

当我在 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)

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

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

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

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

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

【问题讨论】:

  • 回复您对我的回答的评论:错误报告没有提及您的确切问题是对的,但我对它的评论 (bugs.python.org/msg80293) 表明修复程序正确打开了流设置了延迟。不是很清楚,我同意:-)

标签: python logging handlers


【解决方案1】:

我想我已经弄清楚了:

因此,当设置延迟时,看起来类层次结构中某处的父 __init__ 方法之一没有被调用。事实上,在我的 Python 安装中检查文件 logging/__init__.py 的源代码,我在 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-ing记录之前被调用。这会导致调用本身假定__init__ 进程已完成的方法。

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

【讨论】:

    【解决方案2】:

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

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

    我已更新the bug you filed。顺便说一句,提交的原始错误报告是#5013,您可以通过搜索RotatingFileHandler 的所有问题(不仅仅是开放问题)找到它,例如this(来自this page)。

    【讨论】:

    • 谢谢!至于原始错误报告,它列出的两个问题(格式化程序被重置并且延迟在翻转时被忽略)似乎都没有描述我的问题。实际上,在搜索了您描述的所有问题之后,我确实在提交自己的错误报告之前阅读了该错误报告,尽管似乎错误的修复也解决了我的问题,但错误描述中的任何内容都没有让我相信这个问题是相关的。很抱歉给您带来麻烦,再次感谢您的帮助。
    • 在旧机器上迁移到 Python 2.7 的另一个原因。
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2017-02-19
    • 2021-05-14
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多