LaravelのMonolog設定とログレベルの使い分けを初心者向けに徹底解説!
生徒
「Laravelのログを調べていたら『Monolog』という言葉が出てきました。これは何ですか?」
先生
「MonologはLaravelがログの記録に使っているライブラリです。Laravelのログ機能はこのMonologの上に作られているので、仕組みを知ると設定の幅がグッと広がりますよ。」
生徒
「ログレベルという言葉も見かけるんですが、どう使い分ければいいですか?」
先生
「ログレベルはメッセージの重要度を示す仕組みです。どのレベルがどんな場面で使うかを一緒に見ていきましょう!」
1. MonologとはLaravelのログを支えるライブラリ
Laravelでログを記録する機能は、内部でMonologというPHP用のログライブラリを使っています。ライブラリとは、よく使う処理をまとめて再利用できるようにしたプログラムの部品集のことです。
Monologは非常に広く使われているオープンソースのライブラリで、ファイルへの書き込みだけでなく、メール送信・Slackへの通知・データベースへの記録など、様々な場所にログを送ることができます。オープンソースとは、プログラムのコードが公開されていて誰でも無料で使えるものです。
LaravelはLogファサードという窓口を提供しており、開発者はMonologの細かい仕組みを意識しなくてもログを書き込めます。しかし設定をカスタマイズしたいときはMonologの知識が必要になります。ファサードとは、複雑な内部処理をシンプルに呼び出せるようにLaravelが用意した便利な仕組みのことです。
2. ログレベルとは何か?8つの種類を理解しよう
ログレベルとは、記録するメッセージの重要度を段階的に分類する仕組みです。Monologは国際的な標準規格(PSR-3)に従って8つのレベルを定義しています。重要度が高い順に並べると以下のとおりです。
| レベル名 | 意味 | 使う場面の例 |
|---|---|---|
| emergency | 緊急事態 | システム全体が使えなくなった |
| alert | 即時対応が必要 | データベースが完全に停止した |
| critical | 重大な問題 | 決済処理が完全に失敗した |
| error | エラーが発生した | 例外が発生してページが表示できない |
| warning | 警告・注意が必要 | 非推奨の機能を使っている |
| notice | 注目すべき通常の出来事 | 重要な設定値が変更された |
| info | 一般的な情報 | ユーザーがログインした |
| debug | デバッグ用の詳細情報 | 変数の中身を確認したい |
この8段階の中からどのレベル以上を記録するかを設定で決められます。たとえばerror以上に設定すると、error・critical・alert・emergencyの4つだけが記録され、warning以下は無視されます。
3. ログレベルの実際の書き方と使い方
Laravelで各ログレベルを使うときは、Logファサードにレベル名と同じメソッドを呼び出します。メソッドとは、クラスの中に定義された処理のまとまりのことです。
以下はそれぞれのログレベルをコードで書いた例です。場面に応じて使い分けることが大切です。
<?php
use Illuminate\Support\Facades\Log;
// 情報として残したいとき(ユーザーの行動記録など)
Log::info('ユーザーがログインしました。', ['user_id' => 123]);
// 軽い問題が起きているとき(動くが注意が必要な状況)
Log::warning('APIのレスポンスが遅延しています。応答時間: 3.5秒');
// エラーが発生したとき(処理が失敗した)
Log::error('決済処理に失敗しました。', ['order_id' => 456, 'reason' => 'カード残高不足']);
// 開発中に変数の中身を確認したいとき
Log::debug('カート内容を確認', ['items' => ['商品A', '商品B'], 'total' => 3200]);
第二引数(2番目に渡す値)に配列を渡すと、メッセージと一緒に詳細情報もログに記録できます。開発中はdebugとinfoを多用して処理の流れを把握し、本番環境ではwarning以上に絞るというのが一般的な使い方です。
4. config/logging.phpでMonologの設定をカスタマイズする
Laravelのログ設定はconfig/logging.phpというファイルで管理されています。このファイルを開くと、ログをどのように保存するかを決めるチャンネルの設定が並んでいます。チャンネルとは「ログをどこへ・どんな形式で・どのレベルから記録するか」をまとめた設定のセットです。
以下はdailyチャンネルにMonologのレベルを指定してカスタマイズした例です。
<?php
// config/logging.phpの設定例
return [
'default' => env('LOG_CHANNEL', 'daily'),
'channels' => [
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'warning'), // warning以上だけ記録
'days' => 30, // 30日分保持
],
],
];
'level' => 'warning'と設定すると、warning・error・critical・alert・emergencyの5段階が記録され、notice・info・debugは記録されません。本番環境ではwarningまたはerrorに設定してログの量を抑えるのがおすすめです。'days' => 30は30日分のログファイルを保持するという意味です。
5. 複数のチャンネルにログを同時に送るstackチャンネル
Laravelにはstackチャンネルという便利な仕組みがあります。stackとは「積み重ね」という意味で、複数のチャンネルをまとめてひとつのように扱える機能です。たとえば「通常のログはファイルに書き込みつつ、重大なエラーだけSlackにも通知する」という設定が一度にできます。
<?php
// config/logging.phpのstackチャンネル設定例
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily', 'slack'], // dailyとslack両方に送る
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'LaravelBot',
'level' => 'critical', // criticalより重大なものだけSlackに通知
],
],
この設定ではdebug以上のすべてのログをdailyファイルに記録しつつ、critical以上の重大なエラーだけをSlack(チャットツール)にも通知します。LOG_SLACK_WEBHOOK_URLはSlackが発行するWebhook URLで、.envファイルに記載します。Webhookとは「特定のイベントが起きたときに外部サービスへ自動で通知を送る仕組み」のことです。
6. .envファイルでログレベルを環境ごとに切り替える方法
開発環境と本番環境でログレベルを変えたい場合、config/logging.phpを直接書き換えるのではなく、.envファイルの設定値を変えるのがベストな方法です。.envファイルとは、環境ごとに異なる設定をまとめた特別なファイルです。
config/logging.phpの中でenv('LOG_LEVEL', 'debug')と書いておけば、.envファイルのLOG_LEVELの値を変えるだけでログレベルを切り替えられます。
// 開発環境の.envファイル設定例
APP_ENV=local
LOG_CHANNEL=daily
LOG_LEVEL=debug // 開発中はすべてのログを記録する
// 本番環境の.envファイル設定例
APP_ENV=production
LOG_CHANNEL=daily
LOG_LEVEL=warning // 本番ではwarning以上だけ記録してログを減らす
開発中はdebugにして変数の中身や処理の流れを細かく確認できるようにし、本番公開時にはwarningやerrorに変えて本当に必要な情報だけを残すというのが現場でよく使われる方法です。.envファイルを変更したあとはphp artisan config:clearコマンドでキャッシュをクリアすることを忘れないようにしましょう。キャッシュとは一時的に保存されたデータのことで、クリアしないと変更が反映されないことがあります。
7. MonologのProcessorを使ってログに自動で情報を付加する方法
MonologにはProcessor(プロセッサー)という機能があります。プロセッサーとは、ログを書き込む前に自動で追加情報を付け加えてくれる仕組みのことです。たとえば「どのユーザーが操作したか」「どのリクエストIDか」などを毎回手動で書かなくても、自動的にすべてのログに付加することができます。
Laravelではconfig/logging.phpのtapオプションを使ってプロセッサーを登録できます。以下はWebRequestProcessorを追加してリクエスト情報を自動付与する設定例です。
<?php
// config/logging.phpにProcessorを追加する例
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'processors' => [
// リクエストのURL・メソッド・IPをログに自動付与する
Monolog\Processor\WebProcessor::class,
// PHPのメモリ使用量をログに自動付与する
Monolog\Processor\MemoryUsageProcessor::class,
],
],
WebProcessorはリクエストのURL・HTTPメソッド(GETやPOSTなどアクセスの種類)・IPアドレスを自動でログに追加します。MemoryUsageProcessorはそのときのPHPのメモリ使用量を記録します。メモリとはプログラムが動くときに使う作業スペースのことです。このようにプロセッサーを活用すると、個別のログを書くたびに毎回同じ情報を書く手間が省けて、ログの品質が均一になります。