18

関数にオプションのロガーを実装したいと思います。何かのようなもの:

def foo(arg1, arg2, arg3, logger=None):
    logger = logger or (lambda *x: None)

    ...
    self.logger.debug("The connection is lost.")

ロガーが存在する場合に備えてログを記録したい。そうしないと、ロガーのデバッグが機能しません。

基本的には、ブロック内のすべてのデバッグ ステートメントをネストするのが簡単な方法ですif loggerが、多くのデバッグ ステートメントがある場合は面倒です。

4

6 に答える 6

16

いくつかのオプション:

ダミーのロガーを作成します (私のお気に入り):

logger = logger or logging.getLogger('dummy') #  without configuring dummy before.

null1 つのレベル効果を持つダミー オブジェクトを作成します

class DummyObject(object):
    def __getattr__(self, name):
        return lambda *x: None

logger = logger or DummyObject()

ブロック内のすべてのデバッグ ステートメントをネストする:

if logger:
    logger.debug("abc")
于 2012-11-23T09:13:08.207 に答える
13

Python 2.7 以降、何もしないモジュールがモジュールNullHandlerに含まれています。logging

import logging      
logging.getLogger('foo').addHandler(logging.NullHandler())

ライブラリのロギングの構成については、ドキュメントを参照してください。

于 2014-10-04T20:48:33.260 に答える
3

さて、それがloggingモジュールの目的です。使い方クックブック

本当に自分でロールしたい場合は、いくつかの選択肢があります。

  • self.logger属性。オブジェクトの構築時に設定するか、基本クラスから継承します。各オブジェクトには独自のロガーがあるため、インスタンスごとに選択的なロギングを行うことができます。

  • 静的メソッドまたはスタンドアロン モジュールを持つロガー クラス。何もしないデフォルトのメソッドを持つことができますが、ユーザーは必要に応じてそれらを実際のハンドラーに自由に置き換えることができます。すべてのクラスが同じオブジェクトまたはモジュールにアクセスします。粒度は失われますが、セットアップの作業は少なくなります。

  • デコレータ。ログに記録する各メソッドの上に a@log('message', LEVEL)を配置すると、メソッドが呼び出されたときに自動的にログが呼び出されます。かなりきれいですが、柔軟性が低くなります。

于 2012-11-23T01:16:32.120 に答える
2

あなたが望むのはログのフィルタリングだと思うので、私の答えは、ログのフィルタリングを簡単に実現する方法についてです。

Python のログ パッケージは既にこれを行っています。ログ フィルタリングを行う方法はたくさんあります。

2 つの基本的な方法は次のとおりです。

  • ログ レベルのフィルタリング
  • ロガー名のフィルタリング

どちらもロギングの構成を使用するため、簡単に構成できます。

例えば:

import logging

logging.basicConfig()  # easily setup a StreamHandler output

logging.getLogger("realm1").setLevel(logging.WARNING)
logging.getLogger("realm2").setLevel(logging.INFO)

def test():
    r1logger = logging.getLogger("realm1")
    r2logger = logging.getLogger("realm2")
    r1logger.info('r1 info')  # won't print
    r2logger.info('r2 info')  # will print

if __name__ == '__main__':
    test()

そのため、ロギング ポリシーを実行時に動的にローカルで変更する必要がない限り、注意深いロギング設定でデフォルト ロガーを使用するだけで十分です。

于 2012-11-23T03:51:28.323 に答える