Python 如何记录带堆栈跟踪(Stack Trace)的错误日志?
记录完整异常堆栈:except 块中用 logging.exception() 或 logger.error(..., exc_info=True);未捕获异常用 sys.excepthook 兜底。本文给出标准写法与最佳实践。
标准写法:在 except 块里调 logger.exception("描述")——自动附加完整堆栈;等价写法是 logger.error("...", exc_info=True)。
基本用法
import logging
logger = logging.getLogger(__name__)
try:
risky_operation()
except Exception:
logger.exception("risky_operation 执行失败") # 自动带堆栈
# 等价于 logger.error("...", exc_info=True)
输出包含完整 traceback:哪一行、调用链、异常类型与消息。
三种场景
# 1. except 块内(最常用)
except ValueError:
logger.exception("参数校验失败")
# 2. except 外也想带堆栈——显式传异常
except Exception as e:
logger.error("失败", exc_info=e) # Python 3.10+ 支持直接传异常对象
# 3. 捕获未处理异常(程序兜底)
import sys
def handle_uncaught(exc_type, exc_value, exc_tb):
logger.critical("未捕获异常", exc_info=(exc_type, exc_value, exc_tb))
sys.excepthook = handle_uncaught
观测云对照
带堆栈的错误日志经观测云 DataKit 采集后,按 status=error 自动聚合到错误追踪视图,堆栈指纹聚合同类错误;与 APM 链路联动可定位到具体请求。
常见问题(FAQ)
Q:exception() 是什么级别? ERROR 级。
Q:exc_info=True 在非 except 块中有效吗? 无效——没有正在处理的异常时输出 NoneType: None。