Boto3 API调用重试导致日志重复打印?为何logger.info输出多次?
重复输出原因分析
最核心诱因:Jupyter环境日志处理器重复注册
Python的logging模块默认不会自动清理历史注册的日志处理器,你每运行一次Jupyter单元格,就会给用到的logger(包括你自己定义的logger、boto3内部自带的logger)新增一个输出处理器。如果累计运行了5次单元格,logger就绑定了5个独立的输出处理器,每触发一次日志打印动作,5个处理器就会各自输出一次内容,最终就出现了你看到的所有日志行都重复5次的现象,包括boto3内部打印的凭证查找日志、你自己写的Session is active日志都会同步重复。
其他可能触发原因
- 代码中存在隐式循环逻辑,多次执行了会话初始化和日志打印代码
- 未关闭logging层级传播:如果你的logger同时配置了父子层级的处理器,且没有设置
logger.propagate = False,日志会向上传递到父logger被重复输出
修复方案
你可以在业务代码前增加日志处理器清空逻辑,每次运行前先清除已有的冗余处理器即可:
import logging import boto3 # 替换为你实际使用的logger实例 logger = logging.getLogger(__name__) # 清空当前logger的所有已注册处理器 logger.handlers = [] # 关闭日志向上传播,避免父logger重复输出 logger.propagate = False # 按需配置你需要的日志处理器即可 logger.addHandler(logging.StreamHandler()) # 原有业务代码 session = boto3.session.Session(profile_name="profile1",region_name="us-east-1") sts_client = session.client('sts') account = sts_client.get_caller_identity()['Account'] logger.info("Session is active: {}".format(account))
运行后如果重复输出消失,即可确认是日志处理器重复注册导致的问题。
内容的提问来源于stack exchange,提问作者juneyangdata
相关产品推荐
相关产品推荐

