Python日志模块:当我运行脚本时,logger越来越多地重复消息

2024-05-01 21:32:24 发布

您现在位置: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(‘测试’) 2020-09-30 15:34:34763-警告-测试

logger.warning(‘测试’) 2020-09-30 15:34:38476-警告-测试 2020-09-30 15:34:38476-警告-测试


Tags: 模块import脚本消息警告formatterlogginglogger
1条回答
网友
1楼 · 发布于 2024-05-01 21:32:24

日志模块使用驻留在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)
...

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

相关问题 更多 >