ロギングとは
Laravelのロギングはチャンネルという概念を軸に設計されています。 チャンネルとはログの書き込み先と方法を定義した設定の単位で、ファイル、Slack、syslog などさまざまな出力先を組み合わせられます。 内部では Monolog ライブラリを使用しており、豊富なハンドラーとフォーマッターを活用できます。デフォルトでは
stack チャンネルが使われます。stack は複数のチャンネルをまとめて扱う親チャンネルです。設定
ロギングの設定はconfig/logging.php に集中しています。環境変数 LOG_CHANNEL でデフォルトチャンネルを切り替えます。
利用可能なチャンネルドライバ
ログレベル
Laravelは RFC 5424 で定義された8段階のログレベルをサポートしています。 深刻度の高い順に並んでいます。
チャンネルの
level 設定は最低ログレベルを意味します。
たとえば level が error なら、error 以上(critical、alert、emergency)のみが書き込まれます。
基本的な使い方
Log ファサード
Illuminate\Support\Facades\Log ファサードを使って各レベルのメッセージを書き込みます。
log() ヘルパー関数
log() ヘルパーを使うと Log ファサードを import せずに書けます。
コンテキスト情報の追加
メッセージと一緒にコンテキスト(配列)を渡すと、関連する情報をまとめて記録できます。withContext() — チャンネル全体に共通コンテキストを付与
特定のチャンネルに対して、以降のすべてのログエントリに共通の情報を付与したい場合はwithContext() を使います。
リクエストIDのようにすべてのログに含めたい情報に向いています。
shareContext() — すべてのチャンネルに共通コンテキストを付与
withContext() は対象チャンネルのみに効果が限られますが、shareContext() はすべてのチャンネルに共通のコンテキストを付与します。
チャンネルの設定
stack チャンネル — 複数チャンネルへの同時書き込み
stack チャンネルを使うと、1回のログ呼び出しで複数のチャンネルに書き込めます。
debug 以上のすべてのログが daily(ファイル)に書き込まれ、critical 以上のみ slack にも送信されます。
daily チャンネル — ログローテーション
daily チャンネルは日付ごとにファイルを分けて、古いファイルを自動削除します。
Slack へのエラー通知
Slack の Incoming Webhook URL を取得し、.env に設定します。
stack チャンネルに slack を含め、LOG_CHANNEL=stack を設定すればエラー発生時に自動通知されます。
特定のチャンネルにログを書き込む
Log::channel() で対象チャンネルを明示的に指定できます。
オンデマンドチャンネル
Log::build() を使うと、設定ファイルに定義せずにその場でカスタムチャンネルを作れます。
テストや一時的な出力先への書き込みに便利です。
実践的なユースケース
ミドルウェアでリクエストIDを付与する
すべてのログに共通のリクエストIDを付与すると、ログから特定リクエストの流れを追いやすくなります。1
ミドルウェアを作成する
2
handle() メソッドを実装する
3
ミドルウェアを登録する
bootstrap/app.php でグローバルミドルウェアとして登録します。request-id が自動的に付与されます。
非推奨警告のログ記録
PHP や Laravel の非推奨機能を使った際の警告をログに残せます。.env でチャンネルを指定します。
Laravel Pail — リアルタイムログ監視
Laravel Pail はターミナルでアプリケーションのログをリアルタイムに確認できる開発ツールです。Pail の実行には PHP の PCNTL 拡張が必要です。
インストール
基本的な使い方
ログのフィルタリング
まとめ
ログレベルの選び方
ログレベルの選び方
チャンネル選択のガイド
チャンネル選択のガイド
- 開発環境:
singleやdailyでファイルに書き込む - 本番環境:
stackでdaily(ファイル保存)とslack(エラー通知)を組み合わせる - 特定処理のログ:
Log::build()でオンデマンドチャンネルを作成して独立したファイルに書き込む - リアルタイム監視:
php artisan pailでターミナルから確認する
本番環境での注意点
本番環境での注意点
debugログには機密情報が含まれる場合があります。本番環境ではLOG_LEVEL=error以上を推奨します。- ログファイルは定期的にローテーションしてディスクを圧迫しないようにしてください(
dailyチャンネルのdays設定)。 - Slack などの外部サービスへの通知はレートリミットに注意してください。重大なエラーのみ通知するようレベルを設定してください。