SlackよりもDiscordのほうがレスポンスが早いオタクです。
運用しているLaravelベースのサービスで万が一500番台のエラーが発生したとき、エラー情報をDiscordに飛ばしてほしい、そういうことありますよね。あるんですよ。
調べたところやるだけでしたので書いておきます。
事前準備
DiscordへのWebhookの設定は公式のドキュメントも参照されてください。
DiscordのWebhookでもっと戯れたい方はこちらの記事も参考になります。
LaravelはSlack宛にログを飛ばせる
LaravelはデフォでSlackに通知を飛ばす機構があります。( https://readouble.com/laravel/8.x/ja/notifications.html )
config/logging.php
に設定がありますね
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => env('LOG_LEVEL', 'critical'),
],
.env
にSlackのwebhookURLを書いておけば、すでにSlackに通知が飛ばせるよう準備されています。助かりますね!
でも今回エラー情報を飛ばしてほしいのはDiscordです。ではどうするか。
DiscordはSlack形式のWebhookをサポートしている
DiscordにGitHubのWebhookを登録している方は /webhooks/{webhook.id}/{webhook.token}/github
のようにURL末尾に /github
をつけることで通知を受け取れるようになるのをご存知かもしれません。
実はSlack互換も用意されています。
POST /webhooks/{webhook.id}/{webhook.token}/slack
あとは実装するだけ
app/Exceptions/Handler.php
にちょっと書き加えます
public function render($request, Throwable $e)
{
$response = parent::render($request, $e);
if (($response->getStatusCode() / 100) === 5 and !config('app.debug')){
$message = 'サーバエラーが発生しました'.PHP_EOL.$e->getMessage().PHP_EOL.$request->fullUrl();
Log::channel('slack')->error($message);
}
return $response;
}
parent::render()
が普通にレスポンスをくれるので、そのデータをちょっとお借りしてログを出します。
ついでに !config(app.debug)
を条件式に入れてデバッグモードのときは飛ばないようにしておきました。
テスト
絶対バグるコードをちょっと書き加えて試します。F5リロードする緊張の一瞬。
ヨシ!