13

Python (2.7) での最初のロギング実験では、基本的なロギング モジュールを作成しています。これにより、ロガーがすばやく作成されます (モジュール/クラスごとに設定する必要はありません)。

私がやりたいことは、レベル INFO 以上のすべてのメッセージをコンソールに表示し、すべての DEBUG レベル情報をテキスト ファイルに移動するロガーを作成することです。

ここまでで、INFO をコンソールに出力し、すべてのログ メッセージをテキスト ファイルに出力するロガーを作成しました。ただし、すべての INFO 以上のメッセージをテキスト ファイルに含める必要はありません。

コードを保持するPython Fiddleを作成しました。

チュートリアルから次のデバッグ メッセージを使用しました。

log.debug('All systems operational')
log.info('Airspeed 300 knots')
log.warn('Low on fuel')
log.error('No fuel. Trying to glide.')
log.critical('Glide attempt failed. About to crash.')

コンソール上で次のものが生成されます。

[INFO] root: Airspeed 300 knots
[WARNING] root: Low on fuel
[ERROR] root: No fuel. Trying to glide.
[CRITICAL] root: Glide attempt failed. About to crash.

そして私の debug_log.txt ファイルで:

2013-06-14 14:51:46,963:DEBUG:root:All systems operational
2013-06-14 14:51:46,964:INFO:root:Airspeed 300 knots
2013-06-14 14:51:46,964:WARNING:root:Low on fuel
2013-06-14 14:51:46,964:ERROR:root:No fuel. Trying to glide.
2013-06-14 14:51:46,964:CRITICAL:root:Glide attempt failed. About to crash.

上記のブロックでは、後半の 4 行をファイルに含めないでください。私がやろうとしていることは可能ですか?どうすれば望ましい結果が得られますか?

4

1 に答える 1

17

独自のハンドラ オブジェクトを作成する必要があります。

ドキュメントから:コア ログ パッケージにある FileHandler クラスは、ログ出力をディスク ファイルに送信します。StreamHandler から出力機能を継承します。したがって、ここでのアイデアは、FileHandlerクラスを拡張し、メソッドで、レベルにないすべてのオブジェクトをemit()除外することです。recordlogging.DEBUG

私はこれをテストしていませんが、うまくいくと思います:

from logging import FileHandler, DEBUG

log = logging.getLogger('foo')


class DebugFileHandler(FileHandler):
    def __init__(self, filename, mode='a', encoding=None, delay=False)
        super().__init__(filename, mode, encoding, delay)
    
    def emit(self, record):
        if not record.levelno == DEBUG:
            return
        super().emit(record)

log.addHandler(DebugFileHandler())

もちろん、このコードを自分のコードに適合させる必要があります。そして、正直なところ、大げさなrecord.level推測ですが、理にかなっていると思います :-) そして、私はそれを正しく理解しました!

この例では、ハンドラーはfooロガーにのみ適用されます。必要に応じて、メイン ハンドラーに対してアクティブにするか、特定のハンドラーに対してのみアクティブにすることができます。

于 2013-06-14T13:30:13.630 に答える