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()
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),
wait=wait_fixed(1),
before_sleep=before_sleep_custom
)
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}")
