在 Laravel 中使用 Slack 進行異常通知

異常處理是軟件開發過程當中沒法逃避的問題。對於一套設計良好代碼高效的程序,出現異常的可能性會比較低,但這並不意味着不會出現異常,有些異常甚至會引發嚴重的後果,因此如何及時的發現程序中的異常並處理它便顯得十分重要了。php

一般,咱們能夠依靠用戶反饋、常常查看程序日誌來發現程序存在的問題。但這要麼不可靠要麼不及時,因此下面咱們介紹一種比較有效的作法--使用 Slack 通知程序跑出的異常信息。laravel

Slack 是一款即時通訊軟件,相似於 QQ,它提供開放的 API,能夠調用它向本身團隊中指定的我的或者頻道(Channel)發送消息,所以用它來進行異常通知是再合適不過的。git

  1. 安裝 maknz/slack-laravelgithub

    具體的安裝方法請參考 Github 上的 [readme](https://github.com/maknz/slack-laravel)。
  2. 配置運維

    安裝完成後使用 php artisan vendor:publish 生成 config\slack.php 配置文件,而後在.env文件中添加以下三項配置值.
    
    ```
    SLACK_ENDPOINT=//slack 終端,即 slack 接口地址
    SLACK_CHANNEL=//消息默認接收頻道
    SLACK_USERNAME//消息默認接收人
    ```
    > 固然,也能夠直接直接在 config\slack.php 對應配置的默認值而不使用 .env,但並不推薦這樣作。
    
    > 根據實際須要設置 SLACK_CHANNEL 和 SLACK_USERNAME ,兩者並非必須的
  3. 調整 AppExceptionsHandler 類的 report 方法,實現 Slack 通知異常信息的邏輯。代碼以下:this

    /**
     * Report or log an exception.
     *
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
     *
     * @param  \Exception  $e
     * @return void
     */
    public function report(Exception $e)
    {
    if ($this->shouldReport($e)) {
        $slackMessage = "\n[Error.{$e->getCode()}] {$e->getMessage()}";
        $slackMessage.= "\n[Line.{$e->getLine()}] {$e->getFile()}";
        $slackMessage.= "\n[Time] ".date('Y-m-d H:i:s');
    
        try {
            Slack::to(config('slack.channel'))->send($slackMessage);
        } catch (\Exception $eOther) {
            \Log::info($slackMessage);
        }
    }
    
    return parent::report($e);
    }
對於一些可能頻繁出現但又不致命的異常,例如404 NotFoundHttpException,咱們可能並不想讓程序通知它。爲此,咱們只須要在 Aop\Exceptions\Handler 類裏的 $dontReort 屬性中加入指定的異常的類型就能夠了。
protected $dontReport = [
        NotFoundHttpException::class,
        // ...
    ];

示例中展現的是對指定的頻道(channel)發送信息,固然你還能夠向指定的人發送,或者其它更復雜的用法。不過要注意指定的用戶名和頻道是本身 slack 團隊中已經存在的,否則會出錯。設計

這樣,當程序中出現異常時,運維能在第一時間收到相關的通知信息,方便及時處理了。日誌

相關文章
相關標籤/搜索