#環境
- PHP 7.4.16
- Laravel 8.34.0
#何が起きたか
Laravelでログのフォーマットを変更するためにapp/Logging/CustomizeFormatter.php
を以下のように設定しました
class CustomizeFormatter
{
/**
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(new LineFormatter(
"%level_name%[%datetime%] url:%extra.url% http_method:%extra.http_method% context:%context% class:%extra.class% function:%extra.function% message:%message% \n",
'Y-m-d H:i:s',
true
));
$handler->pushProcessor(new WebProcessor);
$handler->pushProcessor(new IntrospectionProcessor(Logger::ERROR, ['Illuminate\\']));
}
}
}
これによってログのフォーマットの変更と追加情報の出力には成功したのですが、
エラー時にスタックトレースが出力されなくなってしまいました。
#解決
LineFormatter
クラスは以下のようにスタックトレースを含むか否かを定めるメソッドが存在することがわかりました
public function includeStacktraces(bool $include = true)
{
$this->includeStacktraces = $include;
if ($this->includeStacktraces) {
$this->allowInlineLineBreaks = true;
}
}
なんだ!メソッド呼んだらいいんじゃん!!ということでコードを以下のように書き換えて修正完了です
public function __invoke($logger)
{
$format = new LineFormatter(
"%level_name%[%datetime%] url:%extra.url% http_method:%extra.http_method% context:%context% class:%extra.class% function:%extra.function% message:%message% \n",
'Y-m-d H:i:s',
true
);
$format->includeStacktraces(true);
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter($format);
$handler->pushProcessor(new WebProcessor);
$handler->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, ['Illuminate\\']));
}
}
無事にエラー時にはスタックトレースがログに出力されるようになりました。