Laravel & Amazon CloudWatch Logs

どうもこんにちは

Laravelから出力されるログを、
ファイルも作らずAmazon CouldWatch Logsに投げつける方法ないかなー、
と思っていたら、先人たちはやっているものですね、ありました。

こちらを参考に(ほぼパクリ)実装しました。

https://stackoverflow.com/questions/50814388/laravel-5-6-aws-cloudwatch-log

お決まりのようですが、今回も Laravel 5.8 でお送りします。


事前準備
IAMユーザ

Amazon CloudWatch Logs を使うので、当然のようにIAMユーザを用意します。
CloudWatchFullAccess権限を持っているIAMユーザを作成し、
アクセスキーとシークレットアクセスキーを取得しておきましょう。
もしかしたら、CloudWatchLogsFullAccessでもよかったのかしら。。。

ライブラリインストール

composer経由でインストールします。
composer require maxbanton/cwh
これをインストールすると、依存関係で
aws/aws-sdk-php
monolog/monolog
もインストールされます(monolog/monologについては、laravelのフレームワークの時点で入ってますが)。


実装
ロガークラス

まずはこのクラスを作ります。
保存先はどこでもよいのだと思うのですが、今回はApp\Logger\CloudWatchLogger.phpです。

※1
今回は、ストリーム名にEC2のインスタンスIDを使いたかったので、こんな形にしています。
EC2からアクセスしない場合(ローカルの開発環境とか)は、ここでエラーになっちゃうので
try-catchで囲ってます。

※2
参考サイトには、configから返却するデフォルト値は設定してません。
何も考えずにやっていると、app.hostnameという設定値はどこにもないので
CloudWatch側でストリームが作られなくて小一時間困ってました。
なので、少なくともlocalhostが返ってくるようにしました。

config/logging.php

チャネルを作ります。config/logging.php の channels に、以下を追加します。
ロガークラスの参照先は、適宜。

.env

.envファイルを書き換えます。
環境ごとに作成している場合は、適宜読み替えてください。


実行してみる

下のような感じでログを出力すると、
あら不思議、CloudWatch Logsに出力されています。
※AWSコンソールのスクリーンショットはご勘弁を。

 


まとめ

あとは、ログをS3に定期的に移してあげたり、なんだったり。
EC2に余計なファイルを増やしたくない一心だったので、
目的は達成です。

r.tanakaがお届けしました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です