monologでフォーマットを変更したらスタックトレースが表示されなくなった件


はじめに

laravelのログ出力にはmonologで実装されています。
今回は、このmonologのフォーマットを変更する際にデフォルトだと出力されていたスタックトレースが表示されなくなったので記事として残します。

環境

  • PHP 8.0.8
  • Laravel 8.33.1

スタックトレースが表示されないコード

まずはわかりやすいように公式ドキュメントに書かれてあるコードを使わせて頂きます。

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(new LineFormatter(
                '[%datetime%] %channel%.%level_name%: %message% %context% %extra%'
            ));
        }
    }
}

上記のコードだと確かに意図したフォーマットに変更されるのですが、スタックトレースが表示されなくなってしまいます。そこでmonologのLineFormatterのクラスにはスタックトレースを表示するかしないかを決めることができるincludeStacktracesメソッドがあることがわかりました。下記参照👇
monolog

このメソッドを実行してあげることでスタックトレースが表示されるようになります。

スタックトレースが表示されるコード

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $format = '[%datetime%] %channel%.%level_name%: %message% %context% %extra%';
            $formatter = new LineFormatter($format, null, true);
            $formatter->includeStacktraces();// ここが必要
            $handler->setFormatter(new LineFormatter($formatter);
        }
    }
}

上記のように感じでLineFormatterクラスのインスタンスを生成後にincludeStacktracesのメソッドを実行してあげます。引数はデフォルトがtrueなので特に渡す必要はありません。これで無事にスタックトレースが表示されるようになると思います👏

おわりに

もし僕のようにスタックトレースが表示されなくて困った方がいましたらその方の助けになればと思います🙇‍♂️
もし今回の内容について誤りがありましたらご指摘いただければ嬉しいです。お読み頂きありがとうございました!

参考資料

公式ドキュメント
monolog