1. ホーム
  2. python

[解決済み] Python Logging でログメッセージが2回表示される件

2022-07-06 14:43:32

質問

Pythonのロギングを使っているのですが、なぜかすべてのメッセージが2回表示されます。

ロギングを設定するモジュールがあるのですが。

# BUG: It's outputting logging messages twice - not sure why - it's not the propagate setting.
def configure_logging(self, logging_file):
    self.logger = logging.getLogger("my_logger")
    self.logger.setLevel(logging.DEBUG)
    self.logger.propagate = 0
    # Format for our loglines
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    # Setup console logging
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    ch.setFormatter(formatter)
    self.logger.addHandler(ch)
    # Setup file logging as well
    fh = logging.FileHandler(LOG_FILENAME)
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    self.logger.addHandler(fh)

後ほど、このメソッドを呼び出してログの設定をしています。

if __name__ == '__main__':
    tom = Boy()
    tom.configure_logging(LOG_FILENAME)
    tom.buy_ham()

そして、buy_hamモジュールと言う中で、私は電話をかけます。

self.logger.info('Successfully able to write to %s' % path)

そしてなぜか、すべてのメッセージが2回表示されます。ストリームハンドラの1つをコメントアウトしても、まだ同じことが起こっています。少し奇妙なもので、なぜこれが起こっているのか分かりません(笑)。私が何か明らかなことを見逃していると仮定すると。

乾杯。 Victor

どのように解決するのですか?

あなたは configure_logging を二度呼び出しています(たぶん __init__ のメソッドで Boy ) : getLogger は同じオブジェクトを返しますが addHandler は同様のハンドラがすでにロガーに追加されているかどうかを チェックしません。

そのメソッドへの呼び出しをトレースして、これらのうちの一つを排除してみてください。あるいは、フラグを設定する logging_initialized に初期化されている False の中で __init__ メソッドの Boy を変更し configure_logging を何もしないように変更します。 logging_initializedTrue に設定し、それを True に設定します。

もしプログラムが複数の Boy インスタンスを作成する場合、グローバルな configure_logging 関数がハンドラを追加し Boy.configure_logging メソッドはハンドラを初期化するだけで self.logger 属性を初期化するだけです。

これを解決するもう一つの方法は、ロガーの handlers 属性を確認することです。

logger = logging.getLogger('my_logger')
if not logger.handlers:
    # create the handlers and call logger.addHandler(logging_handler)