第49回: ログ設計(Monolog) — 障害を「すぐ気づいて・すぐ追える」ログを作る

章: 第6章: パフォーマンスとインフラ

本番でエラーが起きたとき、原因を特定するのに何時間もかかっていませんか?

ログが不足していると、エラーの再現手順が分からず原因特定に時間がかかります。Monologを使えば、ログの出力先・フォーマット・レベルを柔軟に制御でき、障害時の対応速度を大幅に上げられます。

ログ設計が不十分だと何が起きるか

error_log() を散発的に書いただけのログでは、いつ・どこで・何が起きたかが追えません。適切なログレベルとコンテキスト情報をセットで記録することで、原因調査が「ログを読む」だけで完結するようになります。

ログレベルの使い分け

レベル 意味 使う場面
DEBUG 詳細なデバッグ情報 開発環境の動作確認
INFO 正常な操作の記録 ユーザーログイン・処理完了
WARNING 異常ではないが注意が必要 非推奨APIの使用・リトライ発生
ERROR エラーが発生したが処理継続 決済失敗・外部API障害
CRITICAL 緊急対応が必要 DBダウン・認証システム障害

チェックポイント: ログにはリクエストIDやユーザーIDをコンテキストとして含めましょう。「どのリクエストで・誰が・何をした結果エラーが起きたか」がログだけで追えるようになります。個人情報(パスワード・クレジットカード番号)は絶対にログに含めてはいけません。

コードサンプル


<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SlackWebhookHandler;

$log = new Logger('app');
$log->pushHandler(new StreamHandler('app.log', Logger::DEBUG));
$log->pushHandler(new SlackWebhookHandler('https://hooks.slack.com/...', Logger::ERROR));

$log->info('ユーザーがログインしました', ['user_id' => 42]);
$log->error('決済処理に失敗しました', ['order_id' => 99]);

まとめ & 次のステップ

  • Monologで出力先・レベル・フォーマットを柔軟に設定できます
  • ログにはリクエストIDとコンテキスト情報を必ず含めましょう
  • ERRORレベル以上はSlack通知など即時アラートを設定することを推奨します
  • 個人情報・パスワードはログに出力しないよう、ログ出力箇所をレビューしましょう
  • Laravelでは config/logging.php で複数チャンネルを設定できます

次回は Dockerでのローカル環境構築 を学びます。チームで環境差異のない開発環境を作る方法を整理しましょう。

Related Articles