2012-04-26 114 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