Python 如何记录带堆栈跟踪(Stack Trace)的错误日志?

记录完整异常堆栈:except 块中用 logging.exception() 或 logger.error(..., exc_info=True);未捕获异常用 sys.excepthook 兜底。本文给出标准写法与最佳实践。

最佳实践
Python 如何记录带堆栈跟踪(Stack Trace)的错误日志?封面

标准写法:在 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。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台