Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良いということを書いていきます。
Laravelに限らず、コンテナでは、JSON形式で標準出力が良いと思いますが、Laravelでは簡単にログをJSON形式で標準出力可能ですので、設定しておいた方が良いと思います!
なぜ、ログをJSON形式で標準出力するのか
なぜJSON形式か
JSON形式はデータを構造化し、分析や監視ツールで扱いやすい形式です。
また、新しい情報を追加するのも容易なため、ログ出力はJSON形式が良いと考えています。
JSON化しておけば、たとえば、AWSのCloudWatchでログ検索する際などで便利です。
なぜ標準出力か
多くのクラウドプロバイダーは、コンテナの標準出力からログを収集し、そのログを分析や可視化するためのツールやサービスを提供しているためです。
AWSで言うと、Fargateでのコンテナでログを標準出力すると、CloudWatchログの1つのロググループにまとまってくれて、簡単にログ検索できます。
これにより、運用やデバッグがスムーズに行えます。
以下の記事のようなメトリクスフィルターも簡単に作れたりします。
CloudWatchLogsのメトリクスフィルターの使い方ーログデータをメトリクス化して監視する
メトリクスフィルターを使いCloudWatchLogsのログデータを 「CloudWatchのメトリクスで見える化する」「メトリクスを監視してアラートをあげる」ということをやってみます。JSONログデータのメトリクス化も可能です。メトリクス化ができれば監視は通常のアラーム設定と同様となります
では、Laravel11を例にログをJSON形式で標準出力する方法を記載します。
Laravel11でログをJSON形式で標準出力する
config/logging.phpの修正
- config/logging.phpの2箇所修正します
- 「use Monolog\Formatter\JsonFormatter;」を追加
channels
の中に以下のようにstdout
を追加
use Monolog\Formatter\JsonFormatter; // これを追加
:
:
:
'channels' => [
// 以下を追加
'stdout' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'with' => [
'stream' => 'php://stdout',
],
'formatter' => JsonFormatter::class,
],
.envの修正
.envを修正します。
以下のように、LOG_CHANNEL=stack
をコメントアウトして、LOG_CHANNEL=stdout
を追加します。
#LOG_CHANNEL=stack // コメントアウト
LOG_CHANNEL=stdout // 追加
動作確認
routes/web.phpでログ出力するようにして動作確認します。
- routes/web.phpの2箇所を修正します
- 「use Illuminate\Support\Facades\Log;」を追加する
- 「Log::debug(‘test’);」を追加する
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Log; // 追加
Route::get('/', function () {
Log::debug('json_log_test'); // 追加
return view('welcome');
});
Laravelアプリにアクセスし、以下のようにターミナル上に出力されれば、JSON形式でログを標準出力できています。
{"message":"json_log_test","context":{},"level":100,"level_name":"DEBUG","channel":"local","datetime":"2024-06-02T00:27:24.540572+00:00","extra":{}}
まとめ
Laravelをコンテナで運用する際には、ログをJSON形式で標準出力することで、運用やデバッグを効率化できます。設定方法も簡単です!