Python日志异常堆栈打印_exc_info使用说明

7次阅读

应传 exc_info=true 的情况是在 except 块中记录当前捕获异常的完整信息;logger.exception() 是其快捷写法,已默认启用;误用如 except 外调用或仅 log str(e) 会导致堆栈丢失。

Python日志异常堆栈打印_exc_info使用说明

使用 _exc_info 参数(实际应为 exc_info)可让 python 日志自动记录当前异常的完整堆信息,便于定位问题。 它不是私有方法或内部参数,而是 Logging 模块中 logger 方法(如 Error()exception())的标准关键字参数,类型为布尔值或三元组。正确使用能显著提升排错效率。

什么时候该传 exc_info=True

当代码处于 except 块中,且你想把刚刚捕获的异常详情(包括文件名、行号、函数名和 traceback)写入日志时,就该启用它:

  • 不传或设为 False:只记录日志消息,不包含堆栈
  • 设为 True:自动调用 sys.exc_info() 获取最近一次异常信息并格式化输出
  • 传入三元组 (type, value, traceback):用于手动传递特定异常上下文(如在 except 外重抛前记录)

exception() 方法已默认开启 exc_info

logger.exception(msg)logger.error(msg, exc_info=True) 的快捷写法,专为异常场景设计:

  • 必须在 except 块内调用才有效,否则无异常上下文可取
  • 即使没显式写 exc_info=True,它也会强制打印堆栈
  • 推荐在捕获异常后优先用 exception(),语义更清晰

避免常见误用

以下做法容易导致堆栈丢失或内容错误:

立即学习Python免费学习笔记(深入)”;

  • except 外传 exc_info=True → 记录的是上一个(可能无关)异常
  • 捕获异常后未处理完就 raisereturn,又忘了记日志 → 异常消失,无迹可查
  • logging.error(str(e)) 替代 exception() → 只有错误文本,没有堆栈和上下文
  • 自定义异常处理器中忽略 exc_info 传递 → 导致日志模块无法还原原始 traceback

简单示例对比

✅ 正确方式(带完整堆栈):

try:     1 / 0 except ZeroDivisionError:     logger.exception("除零错误发生")

❌ 错误方式(只有文字,无堆栈):

try:     1 / 0 except ZeroDivisionError as e:     logger.error(f"出错了:{e}")  # 不会打印 traceback

text=ZqhQzanResources