1

前言

在系统的运行过程中,随着用户体量和开发功能的增多的,多多少少会产生一些bug或者异常处理,然而每次在处理这些问题的时候,耗时最长的并不是去解决问题,而是尝试去找到出错的原因,分析到问题的所在,所以我们引入了 Sentry 异常监控日志记录平台,基于Sentry 可以很快的将错误汇总上报到平台上,从而方便开发人员及时发现问题,并作出修复响应。

但是在出错的过程中,有时候错误或者说是bug并不那么容易发现,他只会存在特定的场景或者数据中触发,从而导致我们本地并不能完整重现这个故障。

为了更方便开发人员定位到错误信息,仅凭借错误日志是往往不够的,需要提高更全更完整的上下文信息,如出错的用户信息、用户版本、用户设备、用户操作系统、用户来源等。

image

记录用户上下文信息

在laravel中可以通过middleware或event来进行上下文信息的填充,这边我选择通过event来进行处理,先快速创建一个监听器。

php artisan make:listener AuthLoginHandler

然后通过sentry scope来填充用户的上下文信息,下面的代码针对用户ID、账号、应用版本、系统版本、设备品牌等进行了填充,可以根据自主项目不太的需求来替换成不同的信息等。

<?php

namespace App\Listeners;

use App\Helpers\AppHelper;
use App\User;
use Sentry\State\Scope;

class AuthLoginHandler
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle($event)
    {
        $user = $event->user;
        if (!is_null($user)) {
            $this->setSentryUserContext($user);
        }
    }

    public function setSentryUserContext(User $user)
    {
        //收集用户上下文信息 && 触发异常的时候上报到sentry
        \Sentry\configureScope(function (Scope $scope) use ($user): void {
            $scope->setUser([
                'id'      => $user->id,
                'account' => $user->account,
                'version' => AppHelper::version()->getVersion(),
                'store'   => AppHelper::info()->appStore(),
                'os'      => AppHelper::info()->getAppOS(),
                'barnd'   => AppHelper::info()->deviceBrand(),
            ]);
        });

    }
}

注册到EventServiceProvider监听的数组中

protected $listen = [
    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\AuthLoginHandler',
    ],
];

设置Tag(标签)

tag的设置是键值对,可以通过tag来更好的查找和区分

$scope->setTag('小米用户',1);

设置额外的信息

可以用于设置一些额外自定义的信息:如目标服务器的时间、请求参数等。

$scope->setExtra('sign','6XBu5$juld3tF');

运行测试

image
image

以上就完成了基本的异常的上下文记录,如果出现一些比较难缠的故障,不确定是数据问题还是逻辑问题的时候就可以通过上下文的用户信息和异常日志来快速定位和重现问题,进行处理了。


Sinming
310 声望21 粉丝

Bug总工程师