はじめに
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なので特に渡す必要はありません。これで無事にスタックトレースが表示されるようになると思います👏
おわりに
もし僕のようにスタックトレースが表示されなくて困った方がいましたらその方の助けになればと思います🙇♂️
もし今回の内容について誤りがありましたらご指摘いただければ嬉しいです。お読み頂きありがとうございました!