必须用 traceback.format_exc() 或 logger.exception() 获取完整异常信息,否则丢失堆栈、文件名、行号等关键定位信息;logger.exception() 仅限 except 块中使用,且需避免传入不可靠变量或在自定义 Formatter 中忽略 record.exc_text。
捕获异常时必须用 traceback.format_exc() 而非 str(e)
直接打印 str(e) 或 repr(e) 只能拿到异常消息,丢失堆栈、文件名、行号、上下文变量等关键信息。日志里只看到 "KeyError: 'user_id'",根本无法定位是哪次请求、哪个函数、哪行代码出的问题。
正确做法是显式调用 traceback.format_exc() 获取完整 traceback 字符串:
import traceback
try:
risky_operation()
except Exception as e:
logger.error("操作失败:%s", traceback.format_exc())
注意:logger.exception() 内部已自动调用该函数,但仅限在 except 块中使用;若需自定义日志格式或异步记录,必须手动调用。
使用 logger.exception() 时不能传入额外参数
logger.exception(msg, *args) 会自动附加 traceback,但前提是 *args 不干扰格式化逻辑。常见错误是写成:
立即学习“Python免费学习笔记(深入)”;
logger.exception("处理 %s 失败", user_id) # ❌ 可能导致格式化异常或 traceback 被截断
更安全的方式是把上下文信息放在消息里,不依赖 *args: