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

Laravel错误处理:用户触发错误页面时如何发送通知给站长?

当然可以!在Laravel里实现错误发生时通知站长(比如发送邮件)是非常实用的需求,我给你分享几种项目里常用的实现方式:

方法一:改造默认的异常处理器

Laravel自带的app/Exceptions/Handler.php是处理所有异常的核心入口,我们可以直接在它的report方法里添加通知逻辑:

  • 首先确保你的.env文件里已经正确配置了邮件服务(比如MAIL_MAILER、MAIL_HOST、MAIL_USERNAME这些参数),保证系统能正常发邮件。
  • 打开Handler.php,找到report方法,修改成这样:
public function report(Throwable $e)
{
    // 只在生产环境发送通知,并且过滤掉404这类非严重错误
    if ($this->shouldReport($e) && app()->environment() !== 'local') {
        // 发送纯文本邮件给站长
        \Illuminate\Support\Facades\Mail::raw(
            "⚠️ Laravel系统发生错误\n\n错误信息:{$e->getMessage()}\n错误文件:{$e->getFile()}\n错误行号:{$e->getLine()}\n请求URL:" . request()->fullUrl(),
            function ($message) {
                $message->to('your-admin-email@example.com')
                        ->subject('【紧急】Laravel系统异常通知');
            }
        );
    }

    // 不要忘记调用父类的report方法,保证默认的日志记录正常工作
    parent::report($e);
}
  • 这里的shouldReport方法是Laravel内置的,会自动过滤掉一些不需要关注的异常(比如404页面未找到)。如果需要自定义过滤规则,你可以在Handler.php里重写这个方法。
方法二:监听异常事件

Laravel会在异常触发时抛出ExceptionOccurred事件,我们可以通过监听这个事件来解耦通知逻辑:

  1. 先生成一个事件监听器:
php artisan make:listener ExceptionAlertListener --event=Illuminate\Foundation\Events\ExceptionOccurred
  1. 打开生成的app/Listeners/ExceptionAlertListener.php,在handle方法里添加邮件通知逻辑,还可以用视图来美化邮件内容:
public function handle(ExceptionOccurred $event)
{
    $exception = $event->exception;

    // 同样只在生产环境处理,并且排除非严重错误
    if (app()->environment() !== 'local' && $this->needsAlert($exception)) {
        // 使用邮件视图发送格式化的错误通知
        \Illuminate\Support\Facades\Mail::send('emails.system_error', [
            'errorMessage' => $exception->getMessage(),
            'errorFile' => $exception->getFile(),
            'errorLine' => $exception->getLine(),
            'requestUrl' => request()->fullUrl(),
            'errorTrace' => $exception->getTraceAsString()
        ], function ($message) {
            $message->to('your-admin-email@example.com')
                    ->subject('Laravel系统错误告警');
        });
    }
}

// 自定义哪些异常需要发送告警
private function needsAlert(Throwable $e)
{
    // 排除404、认证失败这类用户级错误
    return ! ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) &&
           ! ($e instanceof \Illuminate\Auth\AuthenticationException);
}
  1. 最后在app/Providers/EventServiceProvider.php里注册这个监听器:
protected $listen = [
    \Illuminate\Foundation\Events\ExceptionOccurred::class => [
        \App\Listeners\ExceptionAlertListener::class,
    ],
];
额外小建议
  • 如果你想支持更多通知渠道(比如Slack、企业微信),可以用Laravel的Notification类来封装通知逻辑,比直接用Mail更灵活。
  • 生产环境建议配合日志系统一起使用,邮件通知只作为严重错误的告警,避免大量邮件打扰。
  • 可以通过配置config/logging.php来设置日志级别,只发送critical和alert级别的错误通知。

内容的提问来源于stack exchange,提问作者Redzwan Latif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:11