异常实时报警

  • Jesse
  • 2018-04-17 18:09:48
  • 614

当线上服务出现异常时,有时候问题很难察觉,需要自己测试,甚至要等用户反馈问题才知道。

于是想到能不能线上代码出现问题实时通知给相关负责人?比如:即时通讯工具(微信/QQ)或者邮箱。

 

答案是肯定的,在laravel中实现起来就很简单。

(此方法仅针对业务代码出现异常,或者遭到攻击服务不能正常运行的异常)

 

laravel中所有异常都由 App\Exceptions\Handler 类处理

https://d.laravel-china.org/docs/5.4/errors#the-exception-handler

 

因此,我们只要捕获项目中所有异常并实时通知就简单多了。

 

本文测试发送163邮箱

先写好发送邮件内容格式,然后在 App\Exceptions\Handler report 里发送异常通知邮件。

SendEmailController.php

<?php
namespace App\Handlers;

use Illuminate\Support\Facades\Mail;
use Exception;

class ExceptionHandler
{
    /**
     * 报告所有错误异常,通知邮箱
     * @param Exception $e
     */
    public static function reportException(Exception $e)
    {
        if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
            return false;
        }
        if (!env('MAIL_FROM_ADDRESS') || !env('MAIL_TO_ADDRESS')) {
            return false;
        }
        $env = env('APP_ENV');
        if (!in_array($env, ['test', 'master', 'slave'])) {
            return false;
        }

        $errorMsg = sprintf('Exception %s: "%s" at %s line %s ', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine());
        $content = $errorMsg . "\n" .
            'IP: ' . request()->ip() . "\n" .
            '路由(' . request()->method() . '): ' . request()->path() . "\n" .
            '参数: ' . json_encode(request()->all(), JSON_UNESCAPED_UNICODE) . "\n" .
            'Stack trace: ' . "\n" .
            $e->getTraceAsString();
        Mail::raw($content, function ($message) use ($e, $env) {
            $to = env('MAIL_TO_ADDRESS');
            $subject = '错误提示(' . $env . '):' . $e->getMessage();
            $message ->to($to)->subject($subject);
        });
        return true;
    }
}


Handler.php

public function report(Exception $exception)
{
    ExceptionHandler::reportException($exception);
    parent::report($exception);
}


本文出自 showcj,转载时请注明出处及相应链接。