异常实时报警
当线上服务出现异常时,有时候问题很难察觉,需要自己测试,甚至要等用户反馈问题才知道。
于是想到能不能线上代码出现问题实时通知给相关负责人?比如:即时通讯工具(微信/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,转载时请注明出处及相应链接。