2012-04-26 151 views
0

我有一個多線程的Python應用程序,它使用built in logging模塊。爲了控制日誌記錄級別,並且將來可以更容易地將StreamHandlerFileHandler進行交換,我創建了一個通用幫助函數,由每個模塊調用以創建一個相同的記錄器(不同於它的名稱)。什麼可能導致記錄模塊多次記錄記錄?

我該如何解決這個問題?

要點

  1. 項目中的每個模塊都有自己的記錄器實例。是通過向記錄器(self._logger.info("Logger Setup")
  2. 我試圖包括當前線程名(threading.Thread.getName())的單個調用生成
  3. 示例輸出和它確認同一線程調用導致多個日誌。

記錄儀創作 - 現在的工作

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 

回答

2

我的猜測是,你有多個處理程序(即,一個消息被髮射多次;但在重新閱讀你的問題時,看起來你已經知道了)。要調試,試一下:

  • logging.getLogger("").handlers展望(即,在根記錄的處理程序)
  • 檢查您的通話addHandler()
  • Brandon Rhode'slogging_tree模塊
  • 使用pdb跟蹤日誌信息的生命週期(即在調用self._logger.info(…)之前放置一個斷點,然後進入該函數)。
+0

那麼我「知道」我有多個處理程序,但它並沒有爲我註冊,他們都會在每條消息上調用它的'emit'。 – 2012-05-01 13:36:05