Laravelでエラーをslackで通知

投稿者: | 2020年2月2日

前回はメールでのエラー通知を紹介しましたが、今回はslackに通知する方法です。
Laravelもslackへの通知を標準でサポートしており、簡単に対応することができます。
slackに通知する手順は次のようになります。

まずslackにアクセスし、下記画像のように「Incoming Webhook」というアプリを利用できるようにします。

①をクリックし、②で「Incoming WebHooks」と入力すると、該当のアプリが表示されますので、③の追加をクリックします。
その後次の画面が表示されます。

[Slackに追加]を押すと次の画面が表示されます。

ここでエラーを通知したいチャンネルを選択します。すると下記のようなボタンが表示されます。

[Incoming Webhook インテグレーションの追加]を押すと次の画面が表示されます。

この[Webhook URL]がslackに通知するためのURLとなりますので、コピーします。

次にLaravelにslackの設定を行います。.env ファイルにLOG_SLACK_WEBHOOK_URLという項目を追加し、コピーしたURLをセットします。

APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/・・・

DB_CONNECTION=mysql

次に config/logging.php を開き、下記のように記述します。

'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily', 'slack'],   // slackを追加
    ],

    'single' => [
        'driver' => 'single',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
    ],

    'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
        'days' => 14,
    ],

    'slack' => [
        'driver' => 'slack',
        'url' => env('LOG_SLACK_WEBHOOK_URL'),
        'username' => 'Laravel error',  // slackに表示される発言者名
        'emoji' => ':boom:',   // slackに表示される絵文字
        'level' => 'debug',    // 通知するエラーレベル
    ],

    'papertrail' => [
        'driver'  => 'monolog',
        'level' => 'debug',
        'handler' => SyslogUdpHandler::class,
        'handler_with' => [
            'host' => env('PAPERTRAIL_URL'),
            'port' => env('PAPERTRAIL_PORT'),
        ],
    ],

これでエラーが発生すると、ログファイルとslackにその内容が書き込まれることになります。

開発環境など、slackに通知する必要が無い場合は、.env ファイルを次のように変更します。

LOG_CHANNEL=single

このように設定すると、この環境ではログファイルにのみ書き込むようになります。

以上となります。
これで本番環境で 知らないうちにエラーが発生していたなんてことも無くなります。