首页 > 解决方案 > Python日志记录模块:当我运行脚本时,记录器越来越多地重复消息

问题描述

所以我在我的 Spyder IDE 中(并且只在 Spyder 中)遇到了这个奇怪的问题。我使用日志记录模块初始化记录器,每次运行脚本时,消息都会打印越来越多的次数(第一次尝试一次,第二次尝试两次,第三次三次,等等......)。任何想法为什么?编码:

import logging


logger = logging.getLogger(__name__)

handle = logging.StreamHandler()
logger.addHandler(handle)
handle.setLevel(logging.DEBUG)

formatter = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(message)s')
handle.setFormatter(formatter)

logger.warning('Testing')

提前致谢!

编辑:这是我在两次尝试后在控制台中看到的:

logger.warning('Testing') 2020-09-30 15:34:34,763 - 警告 - 测试

logger.warning('Testing') 2020-09-30 15:34:38,476 - 警告 - 测试 2020-09-30 15:34:38,476 - 警告 - 测试

标签: pythonloggingspyder

解决方案


日志记录模块使用一个存在于您的 python 会话中的静态记录器对象。因此,每次运行脚本时,addHandler都会向logger.handlers. 您可以在脚本中添加一行来打印logger.handlers和检查。

...
logger.addHandler(handle)
print(logger.handlers)
...

每次您调用logger.warning该消息时,都会打印与您拥有的处理程序数量一样多的次数。

要解决此问题,您需要删除处理程序:

...
logger.warning('Testing')
logger.removeHandler(handle)

另一个解决方法是在添加新的处理程序之前检查您是否已经有处理程序。这样,您将只有一个处理程序,并且您不需要删除它。

...
if not logger.handlers:
    handle = logging.StreamHandler()
    formatter = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(message)s')
    handle.setFormatter(formatter)
    handle.setLevel(logging.DEBUG)
    logger.addHandler(handle)
...

您也可以先考虑删除所有处理程序。


推荐阅读