【Laravel】LaravelのログをAWS CloudWatchに転送する

バッチが上手く動いてないみたい、大きな障害にはなっていないけどエラーが出ていないかログを確認したい、そういうときにSSHでサーバに接続して、ログディレクトリまで降りていってログファイルを探して開いて検索して……というのが大変しんどいので、せっかくAWS上で動いてるんだし最低限のログをCloudWatchで見られるようにしたら便利じゃね?ってことでやってみました。



参考にしたのはこちら。ほぼこの記事通りで出来ます。

Laravel & Amazon CloudWatch Logs | idealive tech blog



事前準備

  1. CloudWatchFullAccess権限を持つIAMユーザを作成
  2. ライブラリインストール

IAMユーザは良いとして、ライブラリのインストールでちょっと嵌まりました。

$ composer require maxbanton/cwh

とやると最新版(執筆時点で2.0.1)がインストールされるわけですが、最新版が要求するmonologのバージョンが2.0以上。一方でLaravel5.8では1.17以上と指定されているのでインストールされる最新版は執筆時点で1.25.3です。なので、maxbanton/cwhのインストールに失敗します。こちらで要求されるバージョンを確認した上で、

maxbanton/cwh – Packagist

バージョンを落として、

$ composer require maxbanton/cwh 1.1.14

とすればインストールすることが出来ます。



実装

ロガークラスはほぼ記事の通り。

config/logging.php については、すべてのログをCloudWatchに送って7日後にすべて消えるってのでいいのか迷ったので、とりあえずCloudWatchに送りつつローカルにもファイルを残すことにしました。stackチャンネルに cloudwatch を追加するだけで実現出来ます。しばらく運用して要らないな、となったら削除する方向で。

'stack' => [
   'driver' => 'stack',
   'channels' => [
       'daily',
       'cloudwatch'
   ],
   'ignore_exceptions' => false,
],


これでログを見るためにいちいちSSH接続しなくて済むようになりました。便利。



上手く行かなかった点

「ローカルにはすべてのログを記録し、CloudWatchにはエラーログのみ送る」ということを実現したくて、 loggingのcloudwatchチャンネルにlevelを設定してみたのですが、上手く動きませんでした。levelの設定を無視してすべてのログを送ってしまいます。んー。上書きされるのかな。よくわかりませんが。