2023-02-01 に内閣府が公開している祝日データCSVファイルの URL が変わりました。祝日を自前のストレージにダウンロードしてなんやかんやするプログラムの場合、定期的にこの CSV をダウンロードしているかと思います。私はしています。依存先の URL が変わり、リダイレクトもされていないのに気づかないままでいるとダウンロードの処理は失敗しエラーが発生します。こういった定期実行処理のエラー発生時、発生直後に適切にエラーが起きたこととその内容を詳しく知れると便利です。もしそういった通知がない場合、問題が顕在化してから調査をすることとなり問題の解消のための作業が面倒になりやすいです。
PHP のフレームワークである Laravel では定期実行をスケジュールする仕組みがあります。定期実行には cron を利用しており、コンソール実行と同じように扱われます。このコンソール実行時にエラーを Slack に通知する方法の一例を紹介します。
Laravel 9では以下の様に .env に通知先の Slack の webhook URL を入れ app/Exceptions/Handler.php に追記するのみでできます。
# .env
# ~~略~~
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
LOG_SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXxXXxxxxXXXxxxxxXxxXXXx"
<?php
// app/Exceptions/Handler.php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/** 省略 */
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
if(app()->runningInConsole()){
\Log::channel('slack')->error($e);
}
});
}
}
何をやっているかというと、Laravelに備え付けの Slack 用のロガーにどのウェブフックを使えばいいか示し、例外発生時にコンソール実行ならば Slack にそのエラーをロギングさせています。より詳しく調べるには次のドキュメントがたよりになります。
エラー処理 9.x Laravel#例外のレポート
ログ 9.x Laravel#Slackチャンネルの設定
Incoming Webhook | Slack App ディレクトリ