LoginSignup
3
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-08-15

はじめに

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1