基于 Laravel Sentry 扩展包实现 Laravel 学院异常实时监控及告警


应用上线之后,异常监控和告警是个必须要摆上台面的事情,否则等到用户反馈显得被动不说,而且往往已经是已经导致线上服务不可用一段时间了,这是我们不想看到的局面,本着早发现早处理,在第一时间及时响应的原则,我们有必要对线上异常和报错有一个实时监控和告警机制,一旦有异常,立即通过邮件等方式通知相关责任人,然后通过实时监控页面排查原因,进而定位问题进行处理。我们当然可以在异常时手动触发邮件发送,然后到线上机器通过日志对错误进行排查,但如果是分布式部署,有多台机器,不同的服务散落在不同的机器上,就为排查带来麻烦,所幸,业内已经有类似的完整解决方案,那就是 Sentry

sentry slogon

以上是 Sentry 官方的 Slogon,翻译过来就是:

从此不再依赖用户报告错误,开源的错误跟踪工具,帮助开发者实时监控 & 修复异常,持续迭代,高效,提升用户体验。

言简意赅的阐述了 Sentry 的作用和功能,不需要手动发送邮件,不需要登录到不同机器查看错误日志,接入 Sentry,所有这些通通帮你搞定。在 Laravel 应用中,更可以通过扩展包 sentry/sentry-laravel 快速接入,简单上手,即刻拥有一个异常实时监控&告警服务。

在开始之前,我们需要到 Sentry 官网注册一个账号,获取 API 认证信息,Sentry 通过 Project(项目)、Team(团队)、Member(成员) 三种关系管理应用,一个项目/应用可以被多个不同团队订阅,一个团队可能包含多个成员,免费版本仅支持一个用户,我们以免费版本为例进行演示。

Laravel 接入 Sentry 非常简单,安装引导程序新增团队及关联成员,确认告警邮箱,然后新建项目,新建项目页面包含了对 Laravel 的支持:

laravel sentry project

选择 Laravel,然后给项目起个名字,最后点击创建按钮。创建成功后页面会跳转到 Laravel 应用接入指南,我们按照这个指南来操作即可。首先通过 Composer 安装对应扩展包:

composer require sentry/sentry-laravel

对于 Laravel 5.5+ 版本,扩展包会自动发现,无需注册,然后将配置文件发布到 config 目录下:

php artisan vendor:publish --provider="Sentry\SentryLaravel\SentryLaravelServiceProvider"

编辑 .env 文件,将指南页面中的配置项目拷贝进去:

SENTRY_LARAVEL_DSN=这里是你的DSN配置值

接下里,也是最后一步,编辑 App/Exceptions/Handler.phpreport 方法:

public function report(Exception $exception)
{
    if (app()->bound('sentry') && $this->shouldReport($exception)) {
        app('sentry')->captureException($exception);
    }

    parent::report($exception);
}

如果需要的话,还可以编辑 render 方法并自定义一个 500 错误页面,指南上有说明,我不再赘述。

以上是官方指南的做法,学院君没有按照这个做法来实现,而是通过将异常日志记录到 Sentry 中来实现类似的功能(注:该方法仅适用于 Laravel 5.6+ 版本,因为 5.6 版本才引入了日志频道功能),这样做的好处是不需要额外的代码编辑,只需修改 config/logging.php 配置即可。首先在 .env 中修改 LOG_CHANNELstack,然后修改 config/logging.phpchannels 配置如下(我是将 NOTICE 级别以上日志记录到 Sentry):

'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily', 'sentry'],
    ],
    
    ... // 其他自带配置项

    'sentry' => [
        'driver' => 'sentry',
        'level'  => \Monolog\Logger::NOTICE, // The minimum monolog logging level at which this handler will be triggered
        // For example: `\Monolog\Logger::ERROR`
        'bubble' => true, // Whether the messages that are handled can bubble up the stack or not
    ],

就是这么简单,接入之后,坐等线上第一条异常告警信息吧,告警邮件包含了异常详情,你也可以点击链接到 Sentry 官网查看明细,异常列表长这样:

laravel sentry issues

涉及到敏感信息,异常明细就不展示了,Sentry 还会给你发送周异常报告:

laravel sentry weekly report

可谓是非常方便好用,不同团队/成员还可以自定义监听不同的项目(需要付费),更多更高级的玩法参考官方文档吧,从此就可以告别人肉发送告警邮件和异常监控了。

注:异常监控及告警还有个类似的服务 Bugsnag,对应的 Laravel 扩展包是 bugsnag/bugsnag-laravel,感兴趣的同学可以去试试,这里选用 Sentry 是因为其免费版本支持一个月 10k 事件,而 Bugsnag 免费版本一个月仅支持 7.5k 事件,对于个人应用或者项目早期来说应该都是够用的。


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: Laravel 扩展包之开发辅助工具

>> 下一篇: 基于 Laravel 扩展包 LaraStan 实现对项目代码的静态编译检查