python 重试库,支持 打印重试次数 和 异常原因堆栈traceback

290 阅读1分钟
import random
import logging
import traceback
from tenacity import retry, stop_after_attempt, wait_fixed, before_sleep

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def before_sleep_custom(retry_state):
    """在重试之前执行的自定义函数,打印重试原因及完整的堆栈信息"""
    if retry_state.outcome.exception():
        exception = retry_state.outcome.exception()
        # 使用 format_exception 获取完整的堆栈信息
        exception_traceback = ''.join(traceback.format_exception(etype=type(exception), value=exception, tb=exception.__traceback__))
        logger.warning(f"重试前的日志:尝试次数 {retry_state.attempt_number},异常堆栈信息:\n{exception_traceback}")
    else:
        logger.warning(f"重试前的日志:尝试次数 {retry_state.attempt_number}")

@retry(
    stop=stop_after_attempt(5),  # 最多重试5次
    wait=wait_fixed(1),  # 重试间隔固定为1秒
    before_sleep=before_sleep_custom  # 使用自定义的 before_sleep 函数打印重试的日志信息
)
def might_fail():
    """一个可能会失败的函数"""
    x = random.randint(0, 5)
    if x < 4:
        raise Exception("失败了!")
    else:
        return "成功!"

# 尝试执行函数
try:
    result = might_fail()
    print(result)
except Exception as e:
    # 如果函数最终失败(即重试次数用尽后仍未成功),打印最终失败的日志
    logger.info(f"最终失败:{e}")

image.png