1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelからDiscordにエラー通知を飛ばしたい

Last updated at Posted at 2021-05-08

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リロードする緊張の一瞬。

\ ピポッ /
image.png

ヨシ!

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?