1

組み込みのロギングモジュールを利用するマルチスレッドのPythonアプリケーションがあります。StreamHandlerロギングレベルを制御し、将来的にとの交換を容易にするためにFileHandler、各モジュールによって呼び出される共通のヘルパー関数を作成して、(名前以外の)同一のロガーを作成しました。

この問題のトラブルシューティングはどのようにすればよいですか?

キーポイント

  1. プロジェクトの各モジュールには、独自のロガーインスタンスがあります。
  2. サンプル出力は、ロガーへの1回の呼び出しによって生成されます(self._logger.info("Logger Setup")
  3. 現在のスレッド名(threading.Thread.getName())を含めてみましたが、同じスレッドが呼び出していることで複数のログが発生していることが確認されました。

ロガーの作成-現在機能中

import logging
import sys
def createSystemLogHandler(logger):
    # This is now called once at the logger's root 
    ch = logging.StreamHandler(sys.stdout) # Normal output is to stderr which doesn't show up on Window's CMD
    format = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
    ch.setFormatter(format)
    logger.addHandler(ch)
    return logger

def configureSystemLogger(name='', level=logging.WARNING):
        logger = logging.getLogger(name)
        logger.setLevel(level)
        logger.info("Logger Setup")
        return logger

サンプル出力

2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
4

1 に答える 1

2

私の推測では、複数のハンドラーがあります(つまり、1つのメッセージが複数回発行されていますが、質問を読み直すと、すでにそれを知っているように見えます)。これをデバッグするには、次のことを試してください。

  • 見てlogging.getLogger("").handlers(つまり、ルートロガーのハンドラー)
  • への通話を確認するaddHandler()
  • BrandonRhodeの logging_treeモジュール
  • ログメッセージのライフサイクルをトレースするために使用pdbします(つまり、の呼び出しの直前にブレークポイントを設定してからself._logger.info(…)、その関数にステップインします)。
于 2012-04-26T06:00:24.420 に答える