【Laravel8.49】常にログに出したい情報ありますか?withContextの出番です!

2021年8月5日

こんにちは。今回もLaravelのログ機能を解説していきます。バージョン8.49で新たに登場したwithContextを紹介します。

全てのログに共通で出したい情報

さて、アプリケーションを作成していると、「全てのログに共通で出したい情報」がでてきます。運用中トラブルが発生した時に原因を調査しやすくするための情報が多いのですが、例えば以下のような情報です。

  • ログインユーザーID
  • メソッド名

上述の情報は普通にログを出しただけだと現れてこない情報です。ですがトラブル時の状況を把握するためには欠かせない情報であったりします。

これらの情報を出す時、旧バージョンではログを出力する都度情報をわたさなければなりませんでした。以下のように記述します。

Log::info('処理開始', [
    'UserId' => 'tanaka',
    'Method' => __METHOD__]);

ログメソッドの第二引数にコンテキスト情報を配列形式で渡すことができます。そこを利用して、共通で出力したい情報を都度渡します。しかし、これを毎回書くのは労力もさることながら、コードがごちゃごちゃし非常に見通しが悪くなります。ですが今まではそれしか手段がありませんでした。

1回渡せば後は出してくれるようになった

Laravel8.49でこの問題を解決してくれる機能が実装されました。1回だけ共通情報を渡せば、以降の処理で自動出力してくれる機能です。Log::withContextでコンテキスト情報を渡します。ユーザーIDと実行メソッド名を渡してみましょう。

Log::withContext([
    'userId' => 'tanaka',
    'method' => __METHOD__
]);

userIdは通常変数で渡ってくるものと思いますが、今回は固定でtanakaを渡しています。methodは実行時に現在のメソッドを返す__METHOD__を使用しています。(__METHOD__はwithContextが記述されているメソッド名を常に返しますので注意が必要です。)

では上述の処理以降でログを出力してみましょう。

Log::debug('hello world');

出力結果は次の通り

[2021-07-14 23:36:45] local.DEBUG: hello world {"userId": "tanaka","Method":"App\\Http\\Controllers\\SampleController::index"}

withContextで渡した値が出力されました。これで同じ情報を何度も渡さずに済み、コードがよりシンプルになりますね。

まとめ

今回は共通で出力したい情報をwithContextで渡すと、以降のログで常に出力できる方法を解説しました。私は個人的にこの機能を待ち望んでいたので、出た当初はかなり嬉しく思いました。まだ新しい機能なので以降の開発プロジェクトでは積極的に使っていこうと思います。

Laravel

Posted by kobainmac