必须在Django应用启动完成(如wsgi.py/asgi.py末尾)调用sentry_sdk.init()初始化,严禁置于settings.py顶部或views中;需设DEBUG=False、配置ALLOWED_HOSTS,并通过before_send过滤敏感数据、添加CeleryIntegration支持异步任务。

怎样在Django项目中正确安装并初始化Sentry SDK
必须用 sentry-sdk(不是旧版 raven),且初始化位置非常关键:要在 settings.py 加载完成之后、Django应用启动之前完成。常见错误是把 sentry_sdk.init() 放在 settings.py 顶部,或塞进某个 views.py 里——那样根本捕获不到启动期异常(比如数据库配置错、中间件导入失败)。
推荐做法是在 manage.py 或 asgi.py/wsgi.py 的最底部(Django setup 完成后)调用:
import sentry_sdk from sentry_sdk.integrations.django import DjangoIntegration <p>sentry_sdk.init( dsn="<a href="https://www.php.cn/link/9beff913467a3024cbd3d7a92308347b">https://www.php.cn/link/9beff913467a3024cbd3d7a92308347b</a>", integrations=[DjangoIntegration()], traces_sample_rate=0.1, send_default_pii=True, )
-
traces_sample_rate=0.1控制性能监控采样率,生产环境建议设为0.01~0.1,避免上报风暴 -
send_default_pii=True仅在确认不涉敏感字段(如密码、token)时开启;否则应显式过滤,用before_send回调处理 - DNS 必须从 Sentry 项目设置页复制,带完整
https://前缀和@后的域名,漏掉任一字符都会静默失败
为什么Django的500页面没报错,但Sentry里也收不到事件
典型现象:手动触发 raise ValueError("test") 能上报,但真实 500 错误(比如模板渲染失败、ORM DoesNotExist 未被捕获)却不见踪影。根本原因是 Django 的 DEBUG = True 会绕过所有异常中间件,包括 Sentry 的钩子。
务必确认以下三点:
立即学习“Python免费学习笔记(深入)”;
-
DEBUG = False—— 这是硬性前提,Sentry 集成默认只在非调试模式下启用异常捕获 -
ALLOWED_HOSTS已正确配置,否则请求根本进不了 Django,更不会触发异常处理链 - 没有自定义
handler500视图且未调用sentry_sdk.capture_exception()—— 自定义 500 页面若吞掉了异常,Sentry 就收不到
临时验证方法:在视图里写 1/0,访问触发 500,再立刻查 Sentry「Issues」页最新条目时间戳。
如何过滤日志噪音、避免泄露用户数据
Sentry 默认会上报请求体(request.POST)、Cookies、Headers,生产环境极易暴露 token、手机号等。不能依赖前端 scrubbing,必须在 SDK 层拦截。
用 before_send 回调精准控制:
def before_send(event, hint):
if "exc_info" in hint:
exc_type, exc_value, tb = hint["exc_info"]
# 忽略已知无害异常
if isinstance(exc_value, (Http404, PermissionDenied)):
return None
# 删除敏感字段
if "request" in event and "cookies" in event["request"]:
event["request"]["cookies"] = "[Filtered]"
return event
<p>sentry_sdk.init(
...,
before_send=before_send,
)- 不要用正则全局替换
event字段,容易破坏结构导致解析失败 -
Http404和PermissionDenied这类业务异常建议过滤,否则会淹没真正需要关注的崩溃 - 若用了 Celery,需额外加
sentry_sdk.integrations.celery.CeleryIntegration(),否则异步任务异常不上报
怎样验证Sentry是否真正在工作,而不是“看起来在工作”
很多团队配完以为万事大吉,结果线上炸了才发现没上报。最可靠的方式不是看配置有没有报错,而是制造一次可追踪的、带标记的异常:
- 在某个 view 里加
sentry_sdk.capture_message("TEST-PRODUCTION-ALERT", level="error"),然后访问触发,30 秒内查 Sentry 是否出现带TEST-PRODUCTION-ALERT的 issue - 检查 Sentry 项目「Settings → Data Filters」里是否误启了「Filter out errors from localhost」——生产服务器若 hostname 是
localhost,会被直接丢弃 - 查服务端日志:
tail -f /var/log/supervisor/myapp-stderr.log,SDK 初始化失败时通常会打Failed to initialize SDK或 DNS 解析错误
真正棘手的是异步任务、信号处理器、管理命令里的异常——它们脱离 HTTP 生命周期,最容易被忽略。上线前必须针对这三类场景各写一个测试用例触发并验证。


















