Bugsnag 不会自动上报所有异常,必须手动在 App\Exceptions\Handler::report() 中调用 SDK 并添加类型白名单判断,否则仅记录日志;需确认配置、API Key 有效,通过 tinker 手动测试通路,并安全注入脱敏的上下文。

直接说结论:Bugsnag 不会自动上报所有异常,必须手动在 App\Exceptions\Handler::report() 中调用 SDK 并加判断逻辑,否则只走 Laravel 默认日志,根本不会发到 Bugsnag 后台。
为什么 php artisan vendor:publish 后还是收不到错误?
官方命令只是发布配置文件和环境变量占位符(如 BUGSNAG_API_KEY),但不会重写 report() 方法。Laravel 的异常流默认只进日志,不触发 Bugsnag。你看到的“已集成”只是 SDK 装上了,没接通数据出口。
- 检查
config/bugsnag.php是否存在,且'api_key' => env('BUGSNAG_API_KEY')已在.env中填值 - 确认
BUGSNAG_API_KEY是项目级 key(不是组织级),且 Dashboard 中项目状态为 Active - 运行
php artisan tinker手动测试:app('bugsnag')->notify(new \Exception('test')),看是否出现在 Bugsnag 控制台——这是验证 SDK 通路是否正常最直接的方式
怎么写安全的 report() 逻辑?
别无脑转发所有异常,否则 404、表单验证失败这类高频预期错误会迅速耗尽免费配额,还掩盖真实崩溃点。
- 用
get_class($exception)精确比对类型,避免is_a($exception, 'Exception')误判父类 - 明确白名单:只上报
RuntimeException、QueryException、ErrorException、LogicException等底层崩坏类异常 - 主动忽略业务友好型异常:
NotFoundHttpException、ValidationException、ThrottleRequestsException、自定义的ApiException等 - 加兜底判断:
if (!$this->shouldReport($exception)) { return; },复用 Laravel 原有路由/命令行上下文过滤逻辑
如何附带脱敏的用户与请求上下文?
Bugsnag 支持 before_notify 钩子或 app('bugsnag')->registerCallback() 注入字段,但千万别在回调里硬调 Auth::user() 或 request()->all()。
- 用户信息用
optional(Auth::user())->id和optional(Auth::user())->email,避免命令行场景报Auth guard [web] is not defined - 请求信息只取安全字段:
request()->route()?->getName()、request()->method()、request()->ip()、request()->fullUrl()(不含 query string) - 敏感参数必须过滤:不要传
password、token、card_number等字段,Bugsnag 的'filters' => ['password', 'token']配置仅作用于 request body,对自定义 context 无效
真正容易被忽略的是上下文注入时机——registerCallback() 必须在 report() 方法内、app('bugsnag')->notify() 调用前注册,否则回调不生效;另外,队列任务中 request() 为 null,得靠 optional($this->job)->payload()['displayName'] ?? 'unknown' 这类方式 fallback。


















