You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:37:14