1

我有一个使用内置日志记录模块的多线程 Python 应用程序。为了控制日志记录级别并使将来更容易StreamHandler与 a交换FileHandler,我创建了一个由每个模块调用的通用辅助函数来创建一个相同的记录器(除了它的名称)。

我应该如何解决这个问题?

关键点

  1. 项目中的每个模块都有自己的记录器实例。
  2. 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

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

  • 查看logging.getLogger("").handlers(即根记录器上的处理程序)
  • 检查您的来电addHandler()
  • Brandon Rhode 的 logging_tree模块
  • 用于pdb跟踪日志消息的生命周期(即,在调用之前放置一个断点self._logger.info(…),然后单步执行该函数)。
于 2012-04-26T06:00:24.420 回答