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に飛ばす、飛ばさないを制御できます。