什么可能导致日志记录模块多次记录记录?

时间:2012-04-26 03:19:34

标签: python logging

我有一个使用built in logging模块的多线程Python应用程序。为了控制日志记录级别并使以后更容易将StreamHandlerFileHandler交换,我创建了一个由每个模块调用的公共帮助函数来创建一个相同的记录器(除了它的名称)

如何解决此问题?

要点

  1. 项目中的每个模块都有自己的记录器实例。
  2. 通过对记录器(self._logger.info("Logger Setup")
  3. 的单次调用生成样本输出
  4. 我已尝试包含当前线程名称(threading.Thread.getName()),并确认同一线程正在调用导致多个日志。
  5. 记录器创建 - 正在运行

    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
    

1 个答案:

答案 0 :(得分:2)

我的猜测是你有多个处理程序(即,多次发出一条消息;但在重新阅读你的问题时,看起来你已经知道了)。要调试它,请尝试:

  • 查看logging.getLogger("").handlers(即根记录器上的处理程序)
  • 检查您对addHandler()
  • 的来电
  • Brandon Rhode's logging_tree module
  • 使用pdb跟踪日志消息的生命周期(即,在调用self._logger.info(…)之前设置断点,然后单步执行该功能)。