Python异常日志需保留完整上下文、区分错误级别、过滤敏感信息:顶层用logging.exception()记录未捕获异常;捕获时用exc_info=True并补充业务上下文;禁用log.error(e)等丢失堆栈或泄露敏感信息的做法。

记录 Python 异常日志,核心是 保留完整上下文、区分错误级别、避免敏感信息泄露,而不是简单地 print(e) 或 logging.exception() 一用了事。
用 logging.exception() 记录未捕获异常(推荐)
在 try-except 外层或顶层异常处理器中,直接调用 logging.exception(),它会自动记录异常类型、消息和完整 traceback,且日志级别为 ERROR:
- 确保 logger 已配置 handler 和格式化器(含 %(asctime)s、%(levelname)s、%(name)s、%(message)s、%(exc_info)s)
- 不要在 except 块里写
logging.error(str(e))—— 这会丢失堆栈,无法定位问题源头 - 若需补充上下文,可在 exception() 前加一条 logging.info() 或 logging.error(),用同一 request_id 或 trace_id 关联
在 except 中记录已捕获异常(带上下文)
当主动捕获并处理异常(如重试、降级)时,应明确记录“发生了什么、为什么捕获、后续怎么做”:
- 使用
logging.error("处理订单失败,将跳过通知", exc_info=True)——exc_info=True等价于 exception() - 避免裸写
except:,至少写except Exception:;更佳做法是捕获具体异常类型(如 requests.Timeout、ValueError) - 在日志消息中包含关键业务变量(如 order_id、user_id),但过滤掉密码、token、身份证号等敏感字段
禁止记录的三种常见错误
这些做法看似方便,实则大幅降低排障效率:
立即学习“Python免费学习笔记(深入)”;
- log.error(e):只输出字符串,无 traceback,看不出在哪一行出错
- log.error(repr(e)):可能暴露内部对象状态,含敏感内存地址或原始数据
- except: log.exception("未知错误"):掩盖真实异常类型,且“未知错误”无助于分类统计
进阶建议:结构化与可追踪
生产环境建议进一步提升日志可用性:










