LaravelでエラーログをSlackに投稿したい

#エラーログをSlackに投稿したい
G'sAcademyで出会った同期とチームで開発していたWebアプリケーション[「HomeYou」](https://home-you.net/)を
最近リリースしました！

それに伴ってエラー発生時にSlackに通知を送りたいと思い、試してみたところ
とても簡単にできたので、その方法を今回は書き留めていこうと思います。

#リリースした「HomeYou」について...
と、その前に簡単にリリースしたアプリについても軽ーく説明させてもらいます。

今回リリースしたのは、
**Twitterアカウントに匿名でレビュー（メッセージ）を残すことができる
「[HomeYou](https://home-you.net/)（ホームユー）」**というWebアプリケーションです。

SNSは、私たちの生活にとって切っても切れない関係になってきましたが、
リアルな交友関係とも繋がっていて踏みこんだことを発信するのは照れくさかったり、
自分のフィードに投稿が残ってしまい、時間が経つとどこか恥ずかしかったり、
また一方で、最近は誹謗・中傷が問題になっていたりと、
いろんな問題を抱えているな〜という課題感から
自由に自分の想いを投稿できて、かつ優しい世界を実現したいという想いから作ったサービスです。

HomeYouは、Twitterアカウントに対するレビュー（メッセージ）の匿名投稿、
そして、独自のNGワードでのフィルタリングなどがメインの機能となります。
また、心温まるレビューは、サービスを運営する私たちが投稿者の代わりにその相手へお伝えしていきます。

好きなアーティストへの熱い気持ちや
直接伝えるのは恥ずかしい身近な誰かに対するちょっとした感謝の気持ちなどを
気軽に投稿して遊んでみてください〜＾＾
（※投稿にはTwitterアカウントでのログインが必要です！）

では、次のセクションからエラーログをSlackに投稿する手順のお話をしていきます！

#Slack通知の設定手順
**①Incoming webhook URLを取得**
**②config/logging.phpと.env設定**

こんな感じでとてもシンプルです！
Laravel5.6から標準でSlackへの通知ができるようになっており、
簡単に設定ができますので、個人でアプリを開発している方などは非常に便利だと思います。

#手順① Incoming webhook URLを取得
[（公式）Slack での Incoming Webhook の利用](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8)に記載の手順でIncoming webhook URLの取得を行います。(画像の赤枠の部分を使用します！)
<img width="1437" alt="スクリーンショット 2020-06-02 23.24.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510320/daaf9155-7c6c-65de-28f7-5fc6e9e61230.png">

【参考ページ】
[（公式）Slack API](https://api.slack.com/apps)
[slackのIncoming webhookが新しくなっていたのでまとめてみた](https://qiita.com/kshibata101/items/0e13c420080a993c5d16)

#手順②　config/logging.phpと.env設定
続いてlaravelのプロジェクトの設定を行っていきます。

###.envファイル
まず.envファイルに先ほど取得したIncoming webhook URLとログレベルを追記します。
今回はエラーが発生した際に通知をしたいのでerrorとしていますが、
他にemergency、alert、critical、warning、notice、info、debugなどがあります。
[（公式）Laravelログシステムの設定](https://readouble.com/laravel/6.x/ja/logging.html)

```.env
LOG_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxxx 　// 先程取得したIncoming webhook
LOG_SLACK_LEVEL=error // 通知したいログレベル
```

###config/logging.php
続いて、config/logging.phpを一部変更していきます。
①`'stack'=> ['channels'　=> ['single'] `の部分に`'slack'`を追加します。
②`'slack'=> ['level'　=> ['critical'] `の部分を`env('LOG_SLACK_LEVEL', 'critical'),`と変更し、.envファイルから引っ張ってくるようにします。

また、.envファイル等を更新したので、`php artisan config:cache`をお忘れなく！
変更後は、下記通りです。

```php:config/logging.php
'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single','slack'],
            'ignore_exceptions' => false,
        ],
        //省略
        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji' => ':boom:',
            'level' => env('LOG_SLACK_LEVEL', 'critical')
        ],
]
```
すると、Controllerで何らかのエラーが起きた時に
こんなエラーログがSlackに送られてくるようになります。
(※今回が定義していない関数を返してみました。)
<img width="612" alt="スクリーンショット 2020-06-03 13.22.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510320/fb69131e-3d06-88b3-d619-711b2dc74905.png">


さらに、Slackに投稿されるログのフォーマットをカスタマイズすることができます！
`'short' => true`を追記してみます。

```php:config/logging.php
'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'username' => 'Laravel Log',
    'emoji' => ':boom:',
    'level' => env('LOG_SLACK_LEVEL', 'critical'),
    'short' => true, // 短めなフォーマット
]
```
すると一部が結合されて、こんな感じに。
<img width="618" alt="スクリーンショット 2020-06-03 13.07.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510320/346d3f9e-aeca-a124-bb09-bb23cbe4a95d.png">



さらに短くしたい場合は、、、
`'context' => false`を追記してください。

```php:config/logging.php
'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'username' => 'Laravel Log',
    'emoji' => ':boom:',
    'level' => env('LOG_SLACK_LEVEL', 'critical'),
    'short' => true, // 短めなフォーマット
    'context' => false // context部分を表示しない
]
```
そうすると詳細部分が全く表示されなくなります。この辺はお好みで・・・！
<img width="612" alt="スクリーンショット 2020-06-03 13.07.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510320/babacf01-6e46-6fcb-a151-60c3a96bf624.png">





ただ、このままだと開発環境でのエラー等も通知がきてしまうため、
開発時の.envファイルは`LOG_CHANNEL`の部分を`single`に変更しておくと良いと思います！

```php:.env
LOG_CHANNEL=single
```

こんな感じで簡単にSlackにログの投稿ができるようになりました！
よかったらHomeYouも使ってみてください＾＾

[Twitterアカウントに匿名でレビュー（メッセージ）を残すことができる「HomeYou」](https://home-you.net/)

# 参考ページ
[（公式）Slack API](https://api.slack.com/apps)
[（公式）Slack での Incoming Webhook の利用](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8)
[slackのIncoming webhookが新しくなっていたのでまとめてみた](https://qiita.com/kshibata101/items/0e13c420080a993c5d16)
[（公式）Laravelログシステムの設定](https://readouble.com/laravel/6.x/ja/logging.html)