18
2019

Laravel 6.0.3 で Call to undefined method setFormatter() のエラー

CATEGORYPHP
2019/10/4追記、Issue送ったらLaravel 6.1.0で修正されました。バージョンアップでOKです(^-^)

今月頭に新しい長期サポート版 (LTS) となるLaravel 6.0がリリースされたわけだが、やったー!LTSだー!と飛びついたら一個だけバグっぽい現象に遭遇したので対処法書いとく。発生したのはバージョン6.0.3。

現象としては、Laravel 6.0にアップグレードした後に、次のような例外が発生するというもの(以下エラーログから抜粋)。
[2019-09-18 09:59:05] laravel.EMERGENCY: Unable to create configured logger. Using emergency logger. {"exception":"[object] (Error(code: 0): Call to undefined method Monolog\\Handler\\NullHandler::setFormatter() at /vagrant/server/vendor/laravel/framework/src/Illuminate/Log/LogManager.php:376)
[stacktrace]
#0 /vagrant/server/vendor/laravel/framework/src/Illuminate/Log/LogManager.php(347): Illuminate\\Log\\LogManager->prepareHandler(Object(Monolog\\Handler\\NullHandler), Array)
#1 /vagrant/server/vendor/laravel/framework/src/Illuminate/Log/LogManager.php(185): Illuminate\\Log\\LogManager->createMonologDriver(Array)
エラーになっているのはMonologNullHandlerで、確かに自分の環境では、config/logging.php でこんな感じにMonologハンドラチャンネルを設定していた。
'fluent' => [
'driver' => 'monolog',
'level' => 'info',
'handler' => env('FLUENTD_ENABLE', true) ? App\Logging\FluentdHandler::class : Monolog\Handler\NullHandler::class,
],
しかし5.8の時は動いていたのに何故?と思いLogManagerを見てみたところ、Laravel 5.8→6.0でMonolog 2.0が入ってくるようになった結果バグったようだ。
具体的には、Monolog 1.xの頃はHandlerInterfaceにsetFormatter()があったのだが、2.0ではそれがFormattableHandlerInterfaceに分離されたようで、後者を継承していないハンドラーを使うとエラーになってしまう様子。
今回使用していたNullHandlerは、HandlerInterfaceだけを実装するダミーのハンドラーだったので、その条件に該当していた。

Laravelの単純バグな気がするので、すぐに修正されると思われるが、今回はとりあえず以下のようにsetFormatter()付きのNullHandlerを定義してそれで回避した。
namespace App\Logging;

use Monolog\Handler\FormattableHandlerInterface;
use Monolog\Handler\FormattableHandlerTrait;
use Monolog\Handler\NullHandler as NullHandlerBase;

class NullHandler extends NullHandlerBase implements FormattableHandlerInterface
{
use FormattableHandlerTrait;
}
上記以外は今のところこれといった問題も無く、各種ライブラリの対応も進んできたので、無事6.0に移行できそうである。
5.5も5.8も来年にはサポートが終わってしまうため、以降する方はお早めに。
スポンサーサイト



Tag: PHP Laravel

0 Comments

Leave a comment