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)

への呼び出しの前に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__そのため、遅延が設定されている場合、クラス階層のどこかにある親メソッドの 1 つが呼び出されないようです。実際、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およびメソッドがレコードを -ing するdoRollover前に呼び出されることです。これにより、プロセスが完了しemitたと想定しているメソッドが呼び出されます。__init__

これはバグのように見えるので、既に報告されていることが見つからない場合は、バグとして報告します。

于 2010-03-17T19:11:10.613 に答える