株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発

【Laravel】HTTP ステータス 500 となる例外発生時に Slack に例外の内容を通知する

 Laravel は PHP のフレームワークであり、web サイトを作る時に使う時が多々あります。そして web サイトは本番運用前にどこか内々でしか見れない場所に公開してテストをします。この記事で紹介する 500 レスポンスをキャッチして Slack に通知する処理はテスト用サーバにアップロードされるまでに見逃されたバグを検知する時に便利です。
 作り方は次の2STEPです。

// config/logging.php の設定ファイル内を書き換え
        'slack' => [
            'driver'   => 'slack',
            'url'      => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji'    => ':boom:',
            'level'    => 'error',// ←ここの値を使いたいログのレベルの最低値にする。今回は例外以上の異常事態だけ飛ばしたいのでerrorレベル
        ],
// app/Exceptions/Handler.php の render メソッドを改造
    /**
     * Render an exception into an HTTP response.
     *
     * @param  Request   $request
     * @param  Exception $exception
     * @throws Exception
     * @return Response
     */
    public function render($request, Exception $exception): Response
    {
        // parent::render で例外をレスポンス化
        $response = parent::render($request, $exception);

        if ($response->getStatusCode() === HttpStatus::INTERNAL_SERVER_ERROR) {
            // もし生成されたレスポンスのステータスコードが 500 (INTERNAL_SERVER_ERROR)ならば
            Log::channel('slack')->error($exception);// 例外の内容をチャンネル、Slackに通知
            Log::channel('slack')->error($request);// リクエストの内容をチャンネル、Slackに通知
            Log::channel('slack')->error($response);// レスポンスの内容をチャンネル、Slackに通知
        }
        return $response;
    }
}

 こうすると Laravel がよしなに例外をレスポンスに変えた後、そのレスポンスを条件にして例外をSlackに飛ばす、飛ばさないを制御できます。

  • この記事いいね! (0)