【问题标题】:What could cause the logging module to log a record multiple times?什么可能导致日志记录模块多次记录一条记录?
【发布时间】:2012-04-26 03:19:33
【问题描述】:

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

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

要点

  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

【问题讨论】:

    标签: python logging


    【解决方案1】:

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

    • 查看logging.getLogger("").handlers(即根记录器上的处理程序)
    • 检查您对addHandler() 的呼叫
    • Brandon Rhode'slogging_tree模块
    • 使用pdb 跟踪日志消息的生命周期(即,在调用self._logger.info(…) 之前放置一个断点,然后进入该函数)。

    【讨论】:

    • 好吧,我“知道”我有多个处理程序,但它并没有为我注册,他们都会在每条消息上调用它的emit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2017-03-11
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多