4

ロガーを設定しています。このようなもの:

def initLogger(self):
    self.logger = logging.getLogger('MyApp')
    if not self.logger.handlers:
        hdlr = logging.FileHandler('MyApp.log')
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        hdlr.setFormatter(formatter)
        self.logger.addHandler(hdlr)
        self.logger.setLevel(logging.WARNING)

プログラムの起動時に常にログに行を出力したい。しかし、私はそれを警告として記録したくありません。実行の開始を示すトレースを常に保持したいだけです。レベルを INFO または DEBUG に切り替えて、self.logger.info("Program start") を呼び出すことができることはわかっていますが、それは面倒です。ロガーレベルに関係なく出力を強制する方法はありますか?

ありがとう

4

3 に答える 3

3

これがロギング システムの悪用と見なされるかどうかはわかりませんが、次の場合はどうでしょうか。

logging.addLevelName(100, 'INFO')
logging.log(100, 'Program Start')

これにより、次の結果が得られます。

2018-03-06 17:01:29:INFO:root:Program Start

定義済みの最高レベルCRITICALの値は 50 であるため、偽のINFOレベルに 100 を使用すると、現在のログ レベルに関係なく常にログに表示されるようになります。

(ログ レベルがそれを超えるとメッセージが表示されるSTARTのがおかしいと思う場合など、レベル 100 に別の名前を付けることもできます。)INFO

于 2018-03-06T17:04:46.073 に答える
2

頭に浮かぶ最も簡単な方法は、フォーマッターとハンドラーを追加した後、ロガー レベルを設定する前にログ メッセージを書き込むことです。ロギング システムが完全にプログラムによって設定されている場合、明示的にレベルを設定するまでロガーにはレベルが設定されないため、レベルを設定するまですべてのメッセージがログに記録されます。

別の方法は、ログ レベルを設定する代わりにフィルターをインストールすることです。メッセージが指定されたパターンに一致しない限り、またはフィルターのメソッドを呼び出してフィルターをオンにするまで、またはそのようなものがない限り、フィルターは特定のレベルより下のすべてのメッセージを拒否する可能性があります。ただし、これを行うと、効率が少し犠牲になります。の標準実装はLogger、ロギング メソッドのいずれかが呼び出されたときにすぐにレベルをチェックし、十分に高いレベルでない場合はメッセージを破棄するように構築されていますが、フィルターはプロセスの後半でチェックされます。

コード外の何かがすでにロガー レベルを に設定しておりWARNING、それを制御できない場合、それを回避する方法はありません。ロガーレベルを一時的にリセットするか (複数の「世代」のロガーでレベルを確認してリセットする必要があるため、トップレベルのロガーを使用していない場合は面倒になる可能性があります)、または独自のカスタムLoggerサブクラスをインストールする必要があります。ロガーが作成される前。この場合、ロギング システムが機能していることを確認するのは、おそらくあなたの責任ではないと思います。

于 2013-09-04T19:31:12.467 に答える
0

ファイルを開き、起動メッセージを書き込み、それをストリームとしてStreamHandler.

于 2013-09-04T23:53:51.227 に答える