記事広告で解決できることって?
記事広告で解決できることって?
2019.05.17
#50
バックエンドへの道

『Laravel』でログをSlackに投稿する

エリカ

こんばんは、Webディレクターのエリカです。

今日は、LaravelのログをSlackに投稿してみます。

Laravelの設定

ログの設定は下記にまとまっています。

config/logging.php

ここではチャンネルごとにどのようにログを扱うかの設定がまとめられており、デフォルトで利用されるチャンネルは以下のように定義されています。envを利用して上書きできますが、初期値は stack チャンネルが指定されています。

'default' => env('LOG_CHANNEL', 'stack'),

そして、 stack チャンネルは下記のように設定されています。

'stack' => [
        'driver' => 'stack',
        'channels' => ['daily'],
    ],

ログドライバー( driver )は、 stack としています。今回は、「マルチチャンネル」チャンネルを作成するためのラッパー機能を作ります。

なので、この stack チャンネル自体がログを書き出すことはなく、 channels に設定されているチャンネルそれぞれがログの書き出しを行うことになります。

複数のチャンネルをまとめて扱うことができますが、初期値では、 daily チャンネルのみが設定されています。

次に、daily チャンネルの設定です。

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

ログドライバー( driver )は、 daily としています。これは、毎日ファイルを切り替えるタイプのドライバになるものです。ログの書き出し先や、ログレベルなどが設定されています。

書き出し先の初期値は、 storage/logs/laravel.log になっています。

それでは、 stack チャンネルを利用したログの書き出し(実際は daily チャンネルによる)を試します。

artisan tinker や、Laravelアプリケーション内の適当なファイルなどで、以下のコマンドを実行します。

// デフォルトのログチャンネルにログレベル debug でメッセージを渡す。
logger('foo', ['context' => 'bar']);

すると、 storage/logs/ に、laravel-日付.log が、下記の内容で書き出されているはずです。

[2019-04-01 12:34:56] local.DEBUG: foo {"context":"bar"}

また、 Log ファサードを利用すると、それぞれのログレベルを指定してメッセージを送信することができます。

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);

Slackログチャンネルの設定

それでは、ログチャンネルの slack を利用して、Slackにログを投稿できるようにしていきます。

'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'username' => 'Laravel Log',
    'emoji' => ':boom:',
    'level' => 'critical',
],

envLOG_SLACK_WEBHOOK_URL を指定するだけで良さそうです。

下記を参考に、Slackチャンネルに外部から投稿するための、Webhook URL を取得します。

これを、下記のように .env に追記します。

LOG_SLACK_WEBHOOK_URL=取得したWebhookURL

デフォルトの stack ログチャンネルに、以下のように slack も追加します。

'stack' => [
        'driver' => 'stack',
        'channels' => ['daily', 'slack'],
    ],

以上で準備完了です。

ログチャンネル slack のログレベルは、 critical なので、それ以上のログレベルでメッセージを送る必要があります。

Log::critical('foo', ['context' => 'bar']);

まとめ

緊急度の高いエラーが発生したときなどに、インフラ側の設定を特にせずともLaravel側のコードだけでSlack連携が簡単にできるのはとても便利ですね。それではまた。