Laravel 10中如何记录404错误?reportable方法无效求排查
Laravel 10中404异常无法触发reportable的原因与解决方法
问题根源
Laravel的异常处理器app/Exceptions/Handler.php中,默认存在$dontReport属性,其中包含了NotFoundHttpException(对应404页面异常)和ModelNotFoundException这类异常。框架会自动跳过对这些异常的报告流程,因此你之前编写的reportable回调不会被触发。
解决方案
有两种方式可以实现404异常的日志记录:
方法一:移除全局排除列表中的异常
打开app/Exceptions/Handler.php,找到$dontReport属性,将NotFoundHttpException和ModelNotFoundException从数组中移除:
protected $dontReport = [ // 移除以下两行 // NotFoundHttpException::class, // ModelNotFoundException::class, // 保留其他默认异常... ];
之后你原来的reportable回调即可正常捕获这些异常,示例代码如下:
public function register(): void { $this->reportable(function (Throwable $e) { if ($e instanceof NotFoundHttpException || $e instanceof ModelNotFoundException) { Log::error('404异常:'.$e->getMessage(), [ '访问URL' => request()->fullUrl(), '异常类型' => get_class($e) ]); } }); }
方法二:强制触发指定异常的报告(推荐)
如果不想修改全局的$dontReport列表,可以在reportable回调后调用force()方法,强制框架处理这些被排除的异常:
public function register(): void { // 记录404页面访问异常 $this->reportable(function (NotFoundHttpException $e) { Log::error('404页面访问', [ '访问URL' => request()->fullUrl(), '客户端IP' => request()->ip(), '异常信息' => $e->getMessage() ]); })->force(); // 单独记录模型未找到的异常 $this->reportable(function (ModelNotFoundException $e) { Log::error('模型查询失败', [ '模型类' => $e->getModel(), '查询ID' => $e->getIds(), '访问URL' => request()->fullUrl() ]); })->force(); }
这种方式更灵活,不会影响其他异常的默认排除规则。
为什么try-catch能生效?
你之前使用的try-catch方法能捕获ModelNotFoundException,是因为该异常在抛出后还未被框架转换成NotFoundHttpException,也未进入全局异常处理器的排除流程,因此可以直接捕获。但这种方式需要在每个查询点添加代码,确实繁琐,全局处理显然更高效。
内容的提问来源于stack exchange,提问作者Abderrahim Benmelouka
相关产品推荐
相关产品推荐

