1

Python3 で大規模なハードウェア シミュレーション ライブラリを作成しています。ロギングには、Python3 Logging モジュールを使用します。

メソッドレベルの粒度でデバッグメッセージを制御するために、ログを記録したい各メソッド内にサブロガーを作成する方法を「路上で」(わかりました、ここでは StackOverflow で) 学びました。

sub_logger = logging.getChild("new_sublogger_name")
sub_logger.setLevel(logging.DEBUG)

# Sample debug message
sub_logger.debug("This is a debug message...")

setLevel() の呼び出しを変更することで、ユーザーはメソッドごとにデバッグ メッセージを有効/無効にすることができます。

今、ボスマンはこのアプローチが好きではありません. 彼は、ライブラリ内のすべてのロギング メッセージを同じメソッド レベルの粒度で有効/無効にできる単一ポイントを提唱しています。(これは、独自の Python ロギング ライブラリ BTW を作成することによって達成される予定でした)。

ロギングの車輪を再発明したくないので、代わりに Python Logging ライブラリを引き続き使用することを提案しましたが、代わりに Filters を使用してロギング メッセージの単一ポイント制御を可能にしました。

Python Logging Filters を頻繁に使用していませんが、このアプリケーションで Filters と Sublogger.setLevel() を使用することについてのコンセンサスはありますか? 各方法の長所/短所は何ですか?

setLevel() はしばらく使って慣れてきましたが、それが私の客観性に影響を与えているのかもしれません。ただし、別の Python ロギング ライブラリを作成するためにみんなの時間を無駄にしたくはありません。

4

1 に答える 1

4

既存のログモジュールはあなたが望むことをすると思います。コツは、setLevel() を呼び出す場所 (構成操作) を getChild() を呼び出す場所 (進行中のログ操作) から分離することです。

import logging

logger = logging.getLogger('mod1')

def fctn1():
    logger.getChild('fctn1').debug('I am chatty')
    # do stuff (notice, no setLevel)

def fctn2():
    logger.getChild('fctn2').debug('I am even more chatty')
    # do stuff (notice, no setLevel)

そこには setLevel() がないことに注意してください。これは理にかなっています。毎回 setLevel() を呼び出す理由と、メソッドがユーザーが必要とするログレベルをいつ知っているか。

プログラムの最初の構成手順でログ レベルを設定します。辞書ベースの構成、一連の setLevel() 呼び出しを実行する Python モジュール、または ini ファイルなどで作成したものを使用して実行できます。しかし、基本的には次のようになります。

def config_logger():
    logging.getLogger('abc.def').setLevel(logging.INFO)
    logging.getLogger('mod1').setLevel(logging.WARN)
    logging.getLogger('mod1.fctn1').setLeveL(logging.DEBUG)
    (etc...)

フィルターを使いこなしたい場合は、フィルターを使用してスタック フレームを検査し、メソッド名を引き出すことができます。しかし、それはより複雑になります。

于 2013-08-19T23:31:24.800 に答える