Sentry收不到错误主因是LOGGING未路由到Sentry且未启用日志集成;404等需手动捕获;SDK须在wsgi.py等入口初始化,禁用DEBUG=True;告警需单独配置Alert Rules并注意分组逻辑。

为什么 SENTRY_DSN 配置后依然收不到错误?
最常见原因是 Django 的 LOGGING 配置未将错误日志路由到 Sentry。Sentry SDK 默认只捕获未处理异常(如视图中抛出的 ValueError),但不会自动捕获 logging.error() 或 logger.exception(),除非显式启用日志集成。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 安装时必须用
sentry-sdk[integrations](带 integrations 子包),而非旧版raven - 在
settings.py中初始化 SDK 时,传入integrations=[DjangoIntegration(), LoggingIntegration(event_level=logging.ERROR, level=logging.ERROR)] - 确认
SENTRY_DSN是生产环境专用的 DSN(含@后的项目 ID 和域名),且未被环境变量覆盖或误写为测试 DSN - 检查是否启用了
DEBUG = False—— Sentry SDK 在DEBUG=True下默认禁用上报
如何让 404、403 等 HTTP 错误也进入 Sentry?
Django 默认把 404 当作正常流程(不抛异常),因此不会触发 Sentry 捕获。需手动干预,但不能简单地全局 raise —— 这会破坏用户体验和中间件行为。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在自定义
handler404视图中调用sentry_sdk.capture_message("Page not found", level="warning"),并附上request.path和request.META.get('HTTP_REFERER') - 对权限相关错误(如
PermissionDenied),可在中间件中捕获PermissionDenied异常并调用sentry_sdk.capture_exception(exc),但注意避免重复捕获(Django 已将其转为 403 响应) - 慎用
send_default_pii=True:它会让 Sentry 自动收集用户 IP、请求头等敏感字段,生产环境通常应设为False,改用before_send回调按需添加脱敏信息
sentry_sdk.init() 放在 settings.py 还是 manage.py?
必须放在 manage.py 的 if __name__ == '__main__': 块内,或 asgi.py/wsgi.py 的顶层。若写在 settings.py,会导致每次 Django 导入配置时都初始化一次 SDK —— 多进程部署(如 Gunicorn)下会创建多个 Sentry 客户端实例,引发连接泄漏和事件丢失。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在
wsgi.py中,application创建之后、返回之前调用sentry_sdk.init(...) - 确保
init()只执行一次:加个全局 flag 判断,或依赖 Sentry 内部的重复初始化防护(虽有,但不保险) - 传入
environment参数(如environment="production"),否则所有事件默认标记为production,无法区分 staging / prod - 设置
traces_sample_rate=0.1控制性能监控采样率,避免 APM 数据爆炸;错误事件(error events)默认 100% 上报,无需额外配置
告警收不到?重点查这三处配置
Sentry 本身不发邮件/钉钉/企微,它只通过「Alert Rules」触发通知。很多团队卡在这一步,以为 SDK 配好就自动告警了。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 登录 Sentry SaaS 或自建实例,在对应 Project 的
Alerts → Create Alert Rule中新建规则:至少指定「Environment = production」+「Issue frequency ≥ 1 event in 5m」 - 确认 Notification Settings 中已绑定邮箱、Slack channel 或 Webhook —— Webhook 要求目标服务支持接收 Sentry 格式 JSON(字段如
event.level,event.title) - 检查过滤条件:如果规则里勾选了「Only notify on new issues」,老 bug 复现不会告警;生产环境建议关闭该选项,或搭配「Regression」条件使用
真正容易被忽略的是:Sentry 的告警基于 issue 分组逻辑,而分组依赖 stack trace 的哈希。如果错误堆栈里含动态路径(如 /tmp/xxx/)或随机 ID,会导致同一类错误被拆成多个 issue,告警阈值永远凑不够。解决方法是在 before_send 中 normalize path 字段,或在 Alert Rule 中启用「Aggregation: Stack trace only」。


















