CakePHP4で配列やオブジェクトをログ出力する方法

CakePHP4でログの仕様が変わってしまったために、配列などがログ出力できなくなってしまいました。
何とかする方法を紹介します。

CakePHP4のログはテキストしか渡せない

CakePHP3までは、Logクラスに変数を突っ込んでやれば、いい感じにテキストに変換して出力してくれました。
配列でもオブジェクトでもなんでもとりあえず突っ込めば出してくれたので、非常に便利な機能でした。

しかし、CakePHP4ではこの仕様が変わってしまい、引数に配列を渡すとエラーが発生してしまいます。

Error: [TypeError] Argument 1 passed to Cake\Controller\Controller::log() must be of the type string, array given, called in xxxx

エラーメッセージの通り、引数は文字型にしなければならなくなりました。
この問題の回避策として、serialize関数やjson_encode()関数でテキストに変換する方法が紹介されていますが、これらの関数は人間が読むことを想定していないテキストなので正直見やすいとは言えません。

解決方法

他に何かないかなと探してみたところ、var_export関数というのがあったので、これを使ってみたらまだ何とか見れる形になりました。
具体的には以下のような感じで使うとよいかと思います。

$this->log(var_export($data,true));
\Cake\Log\Log::write('debug', var_export($data,true));

とりあえず、対象がオブジェクトでもそれなりに見れる形にはなりました。
ただ残念なことに、DebugKit経由でLogを見ると改行がないため非常に見にくい状態になっています。

それでもとりあえずないよりはかなりましです。ただ、毎回入力するのは面倒だから、そのうちラッパー関数orクラスでも作ろうかな?

タイトルとURLをコピーしました