Laravel のログにリクエストごとのIDを出す

システムに障害が発生してログを見た時に、いいタイミングで同時にリクエストが来てエラーも複数出ている際、これは同一リクエストで起こったエラーなのか、それともそれぞれ異なるリクエストで発生したエラーなのか分からなくなる現象がまれに起きます。特に外部連携系のAPIだと、リクエストが同一サーバーからくることが多いので、IPアドレスをログに出しても全部同じになってしまいます。そういった場合リクエストを区別するために、リクエストごとにUIDを振って出力する必要が出てきます。

Laravel はログ出力に monolog というライブラリを使用しており、 さらに monolog には UidProcessor という UID を振ってログ出力してくれる「プロセッサ」が既に用意されています。これを組み合わせることで、ログに UID が出力されるようになります。

ログ出力のカスタマイズ

Laravel のドキュメントを参考にソースを書きます。Laravel のドキュメントでは single チャネルに対して tap を設定していますが、デフォルト設定では single ではなく stack を使用するようになっています。また、 stack のデフォルト設定は daily なので、 daily に対して tap を指定します。(config/logging.php)

CustomizeFormatter の中身は以下のように書きます。 pushProcessor メソッドを使用し、UidProcessor を追加します。(app/Logging/CustomizeFormatter.php)

ログ出力確認用のコントローラを作成

ログ出力を確認するソースを書きます。出力結果だけ見たい場合はこの章は読み飛ばしてください。

まずはルーティング設定を書きます。HTML 返す気はないのでなんとなく API 配下に書きます。(routes/api.php)

つぎにコントローラーを書きます( app/Http/Controllers/TestLogController.php )

ログ出力の確認

http://127.0.0.1:8000/api/に2回アクセスした結果がこちらです。後ろに JSON っぽい形で uid が出ています。

デフォルトのログフォーマットは Monolog\Formatter\LineFormatter に定義されている [%datetime%] %channel%.%level_name%: %message% %context% %extra%\nで、uid は extra に連想配列として格納されます。フォーマットを変更したい場合は、上記の CustomizeFormatterを以下のように変更することで可能です。

出力は以下のようになります。

UID の桁数はデフォルトだと7桁で出ますが、 UidProcessor のコンストラクタの第1引数で指定可能です。(1~32桁)

他のプロセッサの種類

このようにプロセッサを追加することで、いろいろな情報をログに追加することができます。すでにお気づきかと思いますが、monolog には UID 以外にも標準でプロセッサが用意されています。すでに Laravel 構築済みの場合は/vendor/monolog/monolog/src/Monolog/Processor/を見ると確認できます。

  • GitProcessor
  • HostnameProcessor
  • IntrospectionProcessor
  • MemoryPeakUsageProcessor
  • MemoryProcessor
  • MemoryUsageProcessor
  • MercurialProcessor
  • ProcessIdProcessor
  • PsrLogMessageProcessor
  • TagProcessor
  • UidProcessor
  • WebProcessor

この記事は UID がメインなので、他のプロセッサの紹介は割愛します。ソースきれいで分かりやすいので、気になる方は中身を見て確認してみてください。

環境情報

使用したものバージョン
PHP7.3.10
Laravel6.2.0
monolog2.0.0

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください