ホームページ >バックエンド開発 >Python チュートリアル >Python でのロギングの詳細な紹介 (例付き)
この記事では、Python でのログインについて詳しく説明します (例とともに)。これには一定の参考価値があります。困っている友人は参照してください。お役に立てば幸いです。
#はじめに
インターネット上でのログ記録の基本的な使用法は数多くあるため、ここでは紹介しません。本文を紹介する前に、まず要件を見てみましょう: 他の人が使用できるように、特定の関数をクラス ライブラリにカプセル化する必要があるとします。クラス ライブラリ内のログをどのように処理するか? 数年前、 C# で開発されたプロジェクトでは、次のメソッドを使用しました: ロギング基本クラスを定義します。ロギングを使用する必要があるすべてのクラスは、この基本クラスを継承します。この基本クラスでは、 LogHandler イベント。特定のログ アクションを実装するために使用されます。同時に、クラス A の LogHandler デリゲートをクラス B の LogHandler デリゲートにリンクできます。 LogHandler では、2 つのクラスのログ情報が加算されます。 Python でのロギングの実装を見て以来、私のアプローチは非常に弱いことがわかりました。 前回のブログ「Python:logging.NullHandler の使用」で peewee フレームワークでのログ出力を紹介しましたが、簡単に言うと、peewee という名前の Logger が peewee に定義され、NullHandler が追加されます。ログを出力するための特定のハンドラーを追加すると、非常に便利です。メイン プログラムにも Logger があるとします。peewee を呼び出した後、2 つのログを同じログ ファイルに出力したいとします。明らかに、ファイルが同時にプリエンプションされるリスクがあるため、2 つのログの FileHandler が同じログ ファイルを指すことはお勧めできません。もちろん、メイン プログラムで Logger に peeweee という名前を付けることもできますが、これでは低すぎるだけでなく、同じく Logger をカプセル化する別のライブラリが呼び出された場合、扱いが難しくなります。
木の切り株構造のロガー
Logger オブジェクトはツリー構造として設計されており、parent 属性を持ちます。 root という名前のロガーは、すべてのロガーのルート ノードとしてロギングで定義されており、ルートの親属性は None です。ルートはグローバルです。 Logger オブジェクトを取得するためにlogging.getLogger(name=None)を呼び出す場合、名前が None の場合、ルート ノード root が返されます。 name = 'a.b' のように、name に . が含まれる場合、a という名前のロガーがすでに存在する場合、a.b は a の子ノードになります。a という名前のロガーがない場合、a.b はルートの子ノードになります。 .ノード。 子ロガーはログ メッセージの処理を完了すると、デフォルトでログ メッセージを親ロガーに渡します。したがって、アプリケーションで使用されるすべてのロガーのハンドラーを定義して構成する必要はなく、最上位のロガーのハンドラーを構成し、必要に応じて子ロガーを作成するだけで十分です。 Logger の propagate プロパティを False に設定することで、この配信メカニズムをオフにできます。 これはどういう意味ですか? コードを見てみましょう:
import logging logA = logging.getLogger('a') logA.setLevel(logging.DEBUG) logA.addHandler(logging.StreamHandler()) logB = logging.getLogger('a.b') logB.addHandler(logging.StreamHandler())出力結果:
Logger A Logger B Logger BLogger B が 2 回出力される理由は、logB が次の子ノードであるためです。 logA があり、logB にも Handler が定義されているため、logB の Handler が 1 回出力され、logA の Handler も 1 回、つまり 2 回出力されます。 1回だけ出力したい場合は、logBのHandlerを削除してください。もちろん、これは特にログ管理ツールを手元に持っていない場合に役立ちます。たとえば、プログラム全体の実行順序を理解するにはメイン プログラム内のすべてのログを出力する必要がありますが、特定のモジュールの別のログを出力して、プログラム内のエラー報告や実行順序を明確に理解できるようにしたいとします。モジュール。 前の peeweee の例は簡単に解決でき、peewee ログの親属性をメイン プログラムのログに設定するだけです。
結論
実は、これは説明するのが比較的簡単な問題であり、それほど多くを書く必要はありません。 Python でのロギングの使用方法を共有するつもりはありませんが、ロギングがどのように実装されるかについてのアイデアを共有したいと思います。なぜなら、私はこの問題に遭遇し、解決策を設計したのですが、その後完全に衝撃を受けたからです。離れて。以上がPython でのロギングの詳細な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。