4

そのため、logging.config.fileConfig を実行して、コンソールとファイル ハンドラーを持つファイル構成からログをセットアップします。次に、logging.getLogger(name) を実行してロガーとログを取得します。特定の時間に、ファイルハンドラーのファイル名を変更したい、つまりログローテーション (Windows プラットフォームの問題のため、タイムローテーターを使用できません) を変更するには、logger.handlers を呼び出します - 空のリストが表示されるため、それらを閉じることができません!! ただし、デバッガーをステップ実行すると、明らかに空ではありません (もちろん、デバッガーがないと正しくログに記録できません)。

ここで何が起こっているのかわからない、私が見逃している落とし穴はありますか?

どんな助けにも感謝します。ありがとう。

4

4 に答える 4

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 に答える