sentry python sdk 默认不捕获日志,需显式配置 loggingintegration 并在 logging 初始化前调用 init();logger.exception() 或 exc_info=true 才上报 traceback;生产环境须设 debug=false、send_default_pii=false。

直接上结论:Sentry 的 Python SDK 默认不捕获日志(logging),必须显式配置 LoggingIntegration 并绑定到 logging 模块,否则 logger.error() 一类调用不会上报——这是生产环境静默失败最常见原因。
为什么 sentry_sdk.init() 后日志仍不上报?
默认初始化只捕获未处理异常和 HTTP 请求错误,logging 是独立通道。不手动桥接,日志就永远留在本地文件或控制台。
实操要点:
- 必须传入
integrations=[sentry_sdk.integrations.logging.LoggingIntegration(event_level=logging.ERROR)] -
event_level控制哪些日志级别触发 Sentry 事件(ERROR最常用,WARNING易产生噪音) - 确保在
logging.basicConfig()或logger.addHandler()之前调用sentry_sdk.init(),否则集成可能无法拦截 handler - 若用
structlog,需额外加structlog.stdlib.ProcessorFormatter.wrap_for_formatter配合,否则结构化字段丢失
如何让 logger.exception() 带完整 traceback 上报?
普通 logger.error("msg") 只传消息文本;只有 logger.exception() 或 logger.error("msg", exc_info=True) 才会提取当前异常上下文。
关键细节:
-
logger.exception()等价于logger.error(..., exc_info=True),二者都可触发 Sentry 的 stack trace 解析 - 若手动捕获异常后想上报,必须显式传
exc_info=exc_info,不能只写logger.error(str(e)) - Sentry 自动过滤掉
__traceback__中的sentry_sdk内部帧,但若自定义中间件包装了异常,需确认exc_info未被清空
生产环境必须关闭的两个默认行为
本地开发能用的默认值,在生产中会掩盖问题或拖慢性能。
务必显式覆盖:
-
debug=False:设为True会在 stderr 打印 SDK 内部调试日志,干扰业务日志且暴露敏感配置 -
send_default_pii=False:默认开启时可能上传用户 IP、请求头等 PII 数据,违反 GDPR/等保要求;如需部分上下文,改用before_send回调脱敏 - 额外建议:
max_breadcrumbs=50(默认 100),减少内存占用;sample_rate=0.8(非 1.0)避免突发流量打爆 Sentry 配额
最易被忽略的是日志与异常的归属混淆:同一个错误,既写了 logger.exception() 又抛出未捕获异常,会导致 Sentry 收到两条重复事件。上线前检查所有 try/except 块——要么只记录、要么只抛出,不要两者都做。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











