python - 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 - 警告 - 测试
解决方案
日志记录模块使用一个存在于您的 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)
...
您也可以先考虑删除所有处理程序。
推荐阅读
- php - 是否可以在 Laravel 中自动添加翻译变量?
- java - 为 Eclipse 中的每个源文件夹定义类路径
- python - 使用“is”在 IDLE 和 python shell 中产生不同的结果
- python - 在python中,如何在程序不等待完成的情况下运行函数?
- java - 来自 Spring Security 的 Auth0 访问令牌
- typescript - 类型错误:“值”是只读的
- svn - 使用日期范围过滤 SVN 修订
- laravel - InvalidArgumentException:json_decode 错误:语法错误
- r - 面板大小固定的ggplot(即使图例包含长标签)
- postgresql - 如何将字符串中的值(json)输出到列名及其值中?