RotatingFileHandler выдает исключение, когда задан параметр задержки - PullRequest
3 голосов
/ 17 марта 2010

Когда я запускаю следующий код под 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 , как описано здесь , проблема полностью исчезает.

Я что-то упустил? Как правильно использовать параметр delay класса RotatingFileHandler?

РЕДАКТИРОВАТЬ: После дальнейшего анализа (представлен в моем собственном ответе ниже), это похоже на ошибку, но я не могу найти отчет об ошибке в Python bug tracker , даже пытаясь использовать разные условия поиска, так что, думаю, я сообщу об этом.

Тем не менее, если кто-то сможет найти фактический отчет об ошибке, тогда я могу избежать отправки дублирующего отчета и тратить время разработчиков Python. Я не буду сообщать об ошибке в течение нескольких часов, и если кто-то отправит ответ с текущим отчетом об ошибке, я приму этот ответ на этот вопрос.

Ответы [ 2 ]

5 голосов
/ 18 марта 2010

Я исследовал эту проблему: она была исправлена ​​в Python SVN r68829 от 20 января 2009 года. Это было после выпуска 2.6.1, но до выпуска 2.6.2.

Пожалуйста, обновитесь до Python 2.6.2 или более поздней версии.

Я обновил сообщенную вами ошибку . Кстати, исходная поданная отчет об ошибке была # 5013 , которую вы могли бы найти, найдя все проблемы (не только открытые) по RotatingFileHandler, например this (из this страница ).

0 голосов
/ 17 марта 2010

Я думаю, я только что понял это:

Таким образом, похоже, что один из родительских __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 методы shouldRollover и doRollover вызываются перед emit -записью записи. Это приводит к вызову методов, которые сами предполагают, что процесс __init__ завершен.

Это похоже на ошибку, поэтому я сообщу об этом, если не смогу найти ее, о которой уже было сообщено.

...