CakePHPでは、ログの出力先として「error.log」と「debug.log」が、デフォルトで用意されています。今回は、それとは別のファイルにログを残すやり方を紹介していきます(CakePHP v.3.4.4)。
ログの設定の確認
config/app.phpにロガーの定義が記載されています。
【app.php】
'Log' => [
'debug' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'debug',
'levels' => ['notice', 'info', 'debug'],
],
'error' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'error',
'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], ],
],
デフォルトで、2つのロガー「debug」と「error」の定義がされています。
「path」で、ログファイルまでのパスを設定しています。
「file」で、出力先のファイル名を設定しています。
「levels」で、どのレベルのログの時に出力するかを設定しています。
上記だと、「notice」「info」「debug」レベルのログは「debug.log」に出力されます。
ログの設定に追加
今回は、「error」でも「debug」でもないログを残したいので、新たなロガーを作成し、さらにスコープの追加をしていきます。
ログの書き込み時にスコープ名を設定することができるので、今回追加したロガーのスコープを参照して処理が行われるということになります。
'hello' => [ //←ロガー名
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'hello', //←ファイル名がhello.logになる
'levels' => [],
'scopes' => ['hello'], //←スコープ名
],
「hellog」のロガーを追加しました。
「scopes」を「hello」にしておくことで、ログの書き込み時の引数に「hello」を与えると、この「scopes」の「hello」を参照して「hello」のロガーを使用します。
「info」レベルのログを残す記述は以下のようになります。
Log::info('書き込みたい内容','スコープ名');
今回の場合だと、
Log::info('Hello world','hello');
ここで気をつけることは、上記のコマンドでログを残そうとすると、ログのレベルが「info」なので「debug」ロガーの引き金となり、「debug.log」にも同じログが出力がされます。
※「スコープ名」を指定しても、ログのレベルに設定した出力先にも出てしまうのです。
これを回避するために「debug」の設定に以下を追加します。
'debug' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'debug',
'levels' => ['notice', 'info', 'debug'],
'scopes' => false, //←ここを追加
'url' => env('LOG_DEBUG_URL', null),
],
「scopes」を「false」にしておくことで、ログ出力時にスコープ名を設定してある場合は出力されなくなります。
まとめ
- app.phpのロガーの設定部分に新たなロガーを追加し、スコープの設定をする。
- 書き出したい時はスコープ名を設定してあげる。
- 追加設定したファイル以外に出力したくない場合は、他のロガーの「scopes」を「false」にする。
参考文献
飲食業界からIT業界に転身してきて現在2年目です。PHPの経験がメインとなります。これまで自分がPHPを扱ってきた上で、モヤモヤしてきたことをメインに記事にしていきますのでよろしくお願いいたします。