Laravel 捕捉异常日志发送邮件通知

由于程序出错我们并不能第一时间发现错误并修改错误,特别是服务比较多的情况下,不可能每个服务都去线上查看日志,节假日可以及时接收服务异常信息,所以我们配置了laravel框架捕捉错误并将异常以邮箱方式通知程序开发人员,来及时修改这些bug。

163 邮箱的配置

修改.env配置文件

MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=xxx@163.com
MAIL_PASSWORD=xxx
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=xxx@163.com
MAIL_FROM_NAME=xxx

在Laravel中,所有异常都由App\Exceptions\Handler类处理。这个类包含两个方法:report和render。我们只对report方法; 它用于捕捉异常或将它们发送到Bugsnag或Sentry等外部服务。默认情况下,report方法只是将异常传递给记录异常的基类。但是,我们可以使用它向开发人员发送有关异常的电子邮件。

/**
 * Report or log an exception.
 *
 * This is a great spot to send exceptions to Emails.
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    if ($this->shouldReport($exception)) {
        $this->sendEmail($exception); // sends an email
    }

    return parent::report($exception);
}

/**
 * Sends an email to the developer about the exception.
 *
 * @param  \Exception  $exception
 * @return void
 */
public function sendEmail(Exception $exception)
{
    // sending email
}

这里我们使用shouldReport方法来忽略$dontReport异常处理程序属性中列出的异常。

应用程序发送的每种类型的电子邮件都表示为Laravel中的“email”类。因此,我们需要使用以下make:mail命令创建可email的类:

$ php artisan make:mail ExceptionOccured

将在app/Mail目录中创建一个ExceptionOccured类。

仅发送邮件无法解决问题。我们需要异常的完整堆栈跟踪。为此,我们可以使用SymfonyDebug组件

修改 App\Exceptions\Handler

public function sendEmail(Exception $exception)
{
    try {
        $e = FlattenException::create($exception);

        $handler = new SymfonyExceptionHandler();

        $html = $handler->getHtml($e);

        Mail::to('developer@gmail.com')->send(new ExceptionOccured($html));
    } catch (Exception $ex) {
        dd($ex);
    }
}

注意 - try如果mail发送失败,我们使用了catch避免错误无限循环

确保在文件顶部添加引用类:

use Mail;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;
use App\Mail\ExceptionOccured;

然后,在ExceptionOccured邮件类中修改:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class ExceptionOccured extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * The body of the message.
     *
     * @var string
     */
    public $content;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($content)
    {
        $this->content = $content;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.exception')
                    ->with('content', $this->content);
    }
}

在emails.exception视图文件中添加以下代码:

{!! $content !!}

在主程序中写一个不存在的变量 echo $aaa;

现在,每当您的应用程序中抛出异常时,您将收到一封包含完整堆栈跟踪的电子邮件。

注: 模拟一个异常,会发现异常邮件发送失败,报错信息是

530 5.7.1 Authentication required

清除配置缓存

php artisan config:clear

并重启 php artisan serve

Last modification:September 17th, 2019 at 09:20 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment