3

ログシステムを設定したいPythonプログラム/ライブラリに取り組んでいます。基本的に、端末またはファイルにログを記録したいと考えています。そのために、標準ディストリビューションに組み込まれている優れたロギング パッケージを使用します。

ロギング レベルは、ユーザーが設定を介してカスタマイズできる必要があります。私の問題は、ロガーに接続されているハンドラーの 1 つを取得する方法ですか? 私はこのようなことを少し考えていました:

import logging

class NullHandler(logging.Handler):
    def emit(self,record):
        pass

HANDLERS = {}
HANDLERS['console'] = logging.StreamHandler()
HANDLERS['logfile'] = logging.FileHandler('test.log','w')

logging.getLogger().addHandler(NullHandler())
logging.getLogger('console').addHandler(HANDLERS['console'])
logging.getLogger('logfile').addHandler(HANDLERS['logfile'])

def set_log_level(handler, level):
    if hanlder not in HANDLERS:
        return

    HANDLERS[handler].setLevel(level)

def log(message, level, logger=None):

    if logger is None:
        logger= HANDLERS.keys()

    for l in logger:
        logging.getLogger(l).log(level, message)

ご覧のとおり、私の実装では、作成したハンドラーのインスタンスを格納するために HANDLERS グローバル ディクショナリを使用することが暗示されています。そうするためのより良い方法を見つけることができませんでした。その設計では、ロガーごとに 1 つのハンドラーをプラグインしただけなので、ロガー オブジェクトのハンドラー属性は問題ないはずですが、もっと一般的なものを探しています (つまり、ある日に複数のハンドラーがプラグインされた場合の対処方法)。私のロガーの1つに?)

これについてあなたはどう思いますか ?

どうもありがとうございます

エリック

4

2 に答える 2

0

ハンドラーのレベルだけでなく、ロガーのレベルも設定できます。

import logging
class NullHandler(logging.Handler):
    def emit(self,record):
        pass

logging.getLogger().addHandler(NullHandler())
logging.getLogger('console').addHandler(logging.StreamHandler())

logging.getLogger('console').info("foo")
logging.getLogger('console').setLevel(1000)
logging.getLogger('console').info("foo")
logging.getLogger('console').setLevel(1)
logging.getLogger('console').info("foo")

ハンドラーのログ レベルはこのレベルとは無関係であり、ハンドラーは両方のレベルに達した場合にのみログを記録することに注意してください。

于 2012-11-21T10:09:34.353 に答える
0

少し遅くなりますが、これを行う方法は次のとおりです。

ハンドラーを作成するときに、次のように名前を設定できます。

import logging

stream_handler = logging.StreamHandler()
# Set name for handler
stream_handler.name = "stream_handler"

logging.getLogger().addHandler(stream_handler)

# Use name to find specific handler from list of all handlers for the logger
for handler in logging.getLogger().handlers:
    if handler.name == "stream_handler":
        print(f"Found stream_handler={stream_handler}")
于 2021-04-28T14:19:31.700 に答える