需重写 app\exceptions\handler::report() 方法,仅上报 runtimeexception、queryexception 等严重异常,忽略 notfoundhttpexception 等预期错误,并安全附加脱敏的用户与请求上下文。

怎么让 Laravel 报告自定义异常到 Sentry / Bugsnag
默认情况下,Laravel 的 App\Exceptions\Handler 只会把异常写进日志或渲染成错误页,不会主动发给外部服务。要上报,得手动接入 SDK 并重写报告逻辑。
核心是覆盖 report() 方法,但不能无条件转发——比如 404、验证失败这类预期异常,通常不该上报,否则会刷爆配额。
- 先安装对应 SDK:
composer require sentry/sentry-laravel或composer require bugsnag/bugsnag-laravel - 按官方文档发布配置(如
php artisan vendor:publish --provider="Sentry\Laravel\SentryServiceProvider"),但别直接依赖它自动注册的report()—— 它可能绕过你自己的判断逻辑 - 在
app/Exceptions/Handler.php的report()方法里,用if ($exception instanceof \Exception && !$this->shouldIgnore($exception)) { ... }控制上报边界
哪些异常该被忽略,不往 Sentry 发
不是所有异常都值得上报。高频、业务预期、低严重性的错误塞进去,只会掩盖真正的问题。
典型该忽略的包括:404(NotFoundHttpException)、表单验证失败(ValidationException)、API 频率限制(ThrottleRequestsException)、以及你明确用 throw new CustomUserFriendlyException 标记的业务提示类异常。
- 检查异常类型:
get_class($exception)比is_a($exception, 'Exception')更准,避免父类误判 - 检查 HTTP 状态码(如果请求上下文存在):
response()->status()不可靠,改用$exception->getStatusCode() ?? 500 - 加白名单比黑名单更安全:只对
RuntimeException、QueryException、ErrorException等底层崩坏类异常开上报
如何在异常上报时附带用户和请求上下文
Sentry 和 Bugsnag 都支持在事件中附加额外字段,但 Laravel 默认不传 Auth::user() 或当前路由名,得手动塞。
注意:别在 report() 里调 Auth::user() 而不判空——命令行场景下会报 Auth guard [web] is not defined;也别直接 dump request()->all(),含敏感参数(密码、token)会泄露。
- 用
optional(Auth::user())->id和optional(Auth::user())->email安全取值 - 只传脱敏后的请求信息:
request()->route()?->getName()、request()->method()、request()->ip() - 避免在上报逻辑里触发新异常(比如访问已销毁的 session),否则可能造成上报死循环
本地开发时为什么看不到 Sentry 上报
不是代码没跑,而是 SDK 默认根据 APP_ENV 和 SENTRY_LARAVEL_DSN 双重开关:只要 APP_ENV=local 或 DSN 为空,就静默丢弃事件。
这设计本意是防测试数据污染生产看板,但调试时容易误以为“集成失败”。别改环境变量硬测,用更可控的方式验证:
- 临时在
config/sentry.php里设'send_default_pii' => true并强制'environment' => 'testing' - 在
report()里加一行if (app()->environment('local')) { \Sentry\captureException($exception); dd('sent'); }快速确认链路通不通 - 注意 Laravel Octane 场景:Sentry 的全局 Hub 在 worker 进程间不共享,需用
\Sentry\init()显式重置或改用Sentry\Laravel\Integration提供的钩子
真正难的不是接上 Sentry,是分清哪些异常算“故障”、哪些只是“反馈”,以及确保上报时不带敏感数据——这两点漏一个,后续排查成本翻倍。











