異常處理是軟件開發過程當中沒法逃避的問題。對於一套設計良好代碼高效的程序,出現異常的可能性會比較低,但這並不意味着不會出現異常,有些異常甚至會引發嚴重的後果,因此如何及時的發現程序中的異常並處理它便顯得十分重要了。php
一般,咱們能夠依靠用戶反饋、常常查看程序日誌來發現程序存在的問題。但這要麼不可靠要麼不及時,因此下面咱們介紹一種比較有效的作法--使用 Slack 通知程序跑出的異常信息。laravel
Slack 是一款即時通訊軟件,相似於 QQ,它提供開放的 API,能夠調用它向本身團隊中指定的我的或者頻道(Channel)發送消息,所以用它來進行異常通知是再合適不過的。git
安裝 maknz/slack-laravel 包github
具體的安裝方法請參考 Github 上的 [readme](https://github.com/maknz/slack-laravel)。
配置運維
安裝完成後使用 php artisan vendor:publish 生成 config\slack.php 配置文件,而後在.env文件中添加以下三項配置值. ``` SLACK_ENDPOINT=//slack 終端,即 slack 接口地址 SLACK_CHANNEL=//消息默認接收頻道 SLACK_USERNAME//消息默認接收人 ``` > 固然,也能夠直接直接在 config\slack.php 對應配置的默認值而不使用 .env,但並不推薦這樣作。 > 根據實際須要設置 SLACK_CHANNEL 和 SLACK_USERNAME ,兩者並非必須的
調整 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 團隊中已經存在的,否則會出錯。設計
這樣,當程序中出現異常時,運維能在第一時間收到相關的通知信息,方便及時處理了。日誌