CakePHP 4 のエラーログをレベルに応じて異なるファイルに出力する
はじめに
CakePHP 4 にはデバッグやエラーメッセージのログ機能があり、デフォルトではレベルに応じて logs/debug.php と logs/error.php に出力されます。
例えば PHP のエラーレベル Notice は debug.php に、Warning は error.php に保存されるのですが、それらのファイルには他のログも記録されます。
Notice や Warning は、開発段階ではよく発生するエラーで、専用のログファイルに分けると作業効率があがるケースがあります。
そこで今日は CakePHP 4 でエラーレベルに合わせて異なるログファイルに出力する方法を紹介します。
今回使用したのは CakePHP 4.1.5 (cakephp/app 4.1.1) です。
1. 下準備
今回テストに使用したコントローラです。
Notice、Warning、Error のエラーを出すようにしています。
<?php
declare(strict_types=1);
namespace App\Controller;
class SampleController extends AppController
{
public function index()
{
echo $a; // Notice
file('dummy'); // Warning
dummy(); // Error
exit;
}
}
debug を true していると別なエラーログも残るので false にします。
// .env で設定している場合はそちらを変更してください
'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),
2. 設定方法
設定は config/app.php の 'Log' の箇所に記述されています。
例えば、下記のように変更することで、Notice と Warning を別ファイルに出力することができます。
'Log' => [
'debug' => [
'className' => FileLog::class,
'path' => LOGS,
'file' => 'debug',
'url' => env('LOG_DEBUG_URL', null),
'scopes' => false,
// ↓ notice を削除
'levels' => ['info', 'debug'],
],
'error' => [
'className' => FileLog::class,
'path' => LOGS,
'file' => 'error',
'url' => env('LOG_ERROR_URL', null),
'scopes' => false,
// ↓ warning を削除
'levels' => ['error', 'critical', 'alert', 'emergency'],
],
// ↓ 'notice' と 'warning' を追加
'notice' => [
'className' => FileLog::class,
'path' => LOGS,
'file' => 'notice',
'url' => null,
'scopes' => false,
'levels' => ['notice'],
],
'warning' => [
'className' => FileLog::class,
'path' => LOGS,
'file' => 'warning',
'url' => null,
'scopes' => false,
'levels' => ['warning'],
],
3. おわりに
レベルに応じてファイル分けをしておくと、対応作業の優先順位がつけやすくなるので便利です。特に Notice や Warning がガンガン出ているような状況では、対処すべきエラーが探しやすくなり、開発速度の向上に役立ちます。
設定変更は難しくありませんので、気になった方は試していただければと思います。
また、過去にご紹介した「CakePHP 4.0 で 404 Not Found エラーを別ログに保存する方法」もオススメです。