CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
2024/06/27
CakePHP4で独自のログファイルを作成してログ出力方法を解説
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法や、新しいログ出力のファイルを設定する方法を解説します。
CakePHP4のデフォルトログファイル「debug.log」「error.log」にログ出力する方法
CakePHP4では、デフォルトで「debug.log」「error.log」「queries.log」のログが用意されています。
コントローラーに下記のように記述すると、それぞれ「debug.log」「error.log」にログ出力をすることができます。
1 2 3 4 5 |
// debug.log にログを出力する $this->log("ログテスト01","debug"); // error.log にログを出力する $this->log("ログテスト02","error"); |
第一引数がメッセージで、第二引数が「ログレベル」による出力先の指定です。
この方法は、「debug」レベルのメッセージは「debug.log」ファイルに、「error」レベルのメッセージは「error.log」に、と言うデフォルトで設定されている「ログレベル」によるログの出力先を指定する方法を利用したものです。
今回は、このデフォルトの設定以外に、独自のログファイルを作成し、条件によってログを出力し分ける方法を解説します。
例えば、
「Info(インフォメーションメッセージ)」は「info.log」に出力する
「UsersController.php」でのログは「users.log」に出力する
と言った感じの設定をしたいと思ったときの対応方法です。
ちなみに私は、ロギングスコープを使用して、処理毎にログを分けていく方法が好きですね。
ログ出力の設定は「/config/app.php」に記述する
ログ出力処理の設定は「/config/app.php」に記述されています。
インストールした直後の状態では、350行目くらいから「debug」のログの設定が記述されています。(バージョン等によって少し異なるかと思いますが。)
それに続けて「error」「queries」のログの設定がありますので、独自のログ設定は「queries」の設定に続けて記述するといいでしょう。
例えば、「sampleError.log」と言うログ出力をする場合の設定は下記となります。
1 2 3 4 5 6 7 8 9 10 11 |
'sampleError' => [ 'className' => FileLog::class, 'path' => LOGS, 'file' => 'sampleError', 'url' => env('LOG_SAMPLE_ERROR_URL', null), 'scopes' => ['sampleErrorScope'], 'levels' => ['notice', 'info', 'debug', 'warning', 'error', 'critical', 'alert', 'emergency'], 'mask' => 0666, 'rotate' => 5, 'size' => '10MB', ], |
1行目の「'sampleError' => [
」はログの名称です。
1文字目を小文字で書くローワーキャメルケースで書くようです。
【className】
ログエンジンを指定。標準は CakePHPのログ出力処理を利用する「FileLog::class」となる。
その他、ログの標準出力機能を利用する場合は「SyslogLog::class」を指定し、ログ出力のプラグインを利用する場合はこの項目で指定をする。
今回は CakePHPの標準である「FileLog::class」の解説となる。
【path】
ログファイルを出力するフォルダを指定。デフォルトの出力先は「LOGS(/logs)」。
【file】
出力するログのファイル名。
【url】
【scopes】
「ロギングスコープ」と言う機能を利用してログ出力をする場合に指定する。ローワーキャメルケースで書くようだ。
「scopes」の設定をすると、スコープを指定しないログは出力対象にならない。スコープを使用しない場合は「false」を指定する。
また、「scopes」を指定していても、次項の「levels」の対象になっていない場合はログは出力されない。
また、「['sampleErrorScope01','sampleErrorScope02']
」のように複数指定することもできる。
【levels】
出力対象とするレベルを指定する。
指定できるレベルは以下のもの。
Emergency:システムは使用出来ません
Alert:今すぐ行動する必要がある
Critical:致命的な状態
Error:エラー状態
Warning:警告状態
Notice:正常であるが、重大な状態
Info:インフォメーションメッセージ
Debug:デバッグレベルメッセージ
「'levels' => [],
」のように「levels」を空にした場合はすべてのレベルを出力する。
【mask】
出力するログファイルのパーミッションの指定。「0666」「0755」のように指定する。
指定しない場合はその環境のデフォルトのパーミッションが使われる。
【rotate】
ログファイルをローテーションする場合はそのファイル数を数値で指定する。ローテーションしない場合は 「false」を指定する。
指定しない場合はデフォルトの「10」となる。
【size】
ローテーションする場合の 1ファイルのファイル上限サイズを「2MB」「100KB」のように指定する。
指定しない場合はデフォルトの「10MB」となる。
path、file、mask、rotate、sizeなどは、classNameの設定で「FileLog::class」を指定した場合に有効になります。
また、【path】のところで説明した「LOGS」フォルダですが、CakePHPではシステム上で定義されている定数がいくつかあります。
それについては下記に記事を書いていますので、併せて参考にしてください。
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
ログを出力するコントローラー、モデルでの処理
ログレベル(levels)を指定してログ出力をする場合の処理
ログレベル(levels)を指定してログ出力をする場合の処理は、一番最初に記載したように、下記の記述をします。
コントローラーに記述する場合は下記になります。
1 2 3 4 5 |
// debug.log にログを出力する $this->log("ログテスト01","debug"); // error.log にログを出力する $this->log("ログテスト02","error"); |
モデルに記述する場合は下記になります。
1 2 |
// まず最初に use句を追記する use Cake\Log\Log; |
use句の「use Cake\Log\Log;
」の記述を忘れると、「Class "App\Model\Table\Log" not found
」と言うエラーが出力されます。
続いて、各処理の中に下記を記述します。
1 2 3 4 5 |
// 「debug」レベルのログを「debug.log」に出力する場合 Log::debug("デバッグです"); // 「error」レベルのログを「error.log」に出力する場合 Log::error("エラーです"); |
ログレベル(levels)を指定して複数のログに出力をする場合の処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'debug' => [ 'className' => FileLog::class, 'path' => LOGS, 'file' => 'debug', 'url' => env('LOG_DEBUG_URL', null), 'scopes' => false, 'levels' => ['notice', 'info', 'debug'], ], 'debug2' => [ 'className' => FileLog::class, 'path' => LOGS, 'file' => 'debug2', 'url' => env('LOG_DEBUG_URL', null), 'scopes' => false, 'levels' => ['notice', 'info', 'debug'], ], |
上記のように「/config/app.php」に「levels」の設定に「debug」が複数のログ設定にある場合、下記の「debug」のログレベルを指定してログ出力した場合は、「debug.log」「debug2.log」の両方にログ出力されます。
1 2 |
// debug.log debug2.logの両方にログを出力する $this->log("ログテスト01","debug"); |
ロギングスコープ(scopes)を指定してログ出力をする場合の処理
ロギングスコープ(scopes)を指定してログ出力をする場合の処理は、下記を記述します。
コントローラーでロギングスコープを指定する方法
コントローラーに記述する場合はでは下記を記述します。
1 2 |
// 「sampleErrorScope」のスコープを指定する場合 $this->log("エラーです", "error", ["scope" => ["sampleErrorScope"]]); |
第一引数が、エラーメッセージ。
第二引数が、ログレベル。
第三引数が、その他の設定で、上記は「ログスコープ」を指定しています。
第三引数で指定するスコープは「scopes」で指定した名称です。
上記の例では「sampleError」と記述しているログの名称の方ではありませんのでご注意ください。(とは言え「scopes」の値を「sampleError」と同じ文字列にする場合が多いんですが。)
ちなみに、「scope」で指定した値が、「app.php」内の「scopes」で設定しているものに存在しない場合でもエラー等の発生はありません。
もちろんログも出力されませんので、出力されているハズのログが出力されていない場合は「scope」の値が間違っているのかもしれません。
モデルでロギングスコープを指定する方法
モデルでは下記を記述します。
1 2 |
// まず最初に use句を追記する use Cake\Log\Log; |
1 2 3 4 |
// 「sampleErrorScope」のスコープを指定する場合 // 「error」レベルのログを「error.log」に出力する場合 Log::error("エラーです", ["scope" => ["sampleErrorScope"]]); |
最初の「Log::error
」の「error
」の部分がエラーレベル。
第一引数が、エラーメッセージ。
第二引数が、その他の設定で、上記は「ログスコープ」を指定しています。
CakePHP4で配列、オブジェクトを出力する場合は「var_export()」を使用する
CakePHP4からは、配列やオブジェクトをログ出力する際に「var_export()」を使用する必要があります。
CakePHP3も CakePHP4も基本的なログの設定方法、出力の指定方法などは変わらないのですが、なぜかこの配列やオブジェクトを直接出力してくれなくなっています。
1 2 3 4 5 6 7 8 9 10 |
$sampleArray = [ "aaa" => "aaa01", "bbb" => "bbb01", ]; // CakePHP3までの配列をログ出力する際の記述方法(CakePHP4ではエラーになる) $this->log($sampleArray,"debug"); // CakePHP4から配列をログ出力する際の記述方法 $this->log(var_export($sampleArray,true),"debug"); |
CakePHP3までは配列やオブジェクトの変数もそのまま記述すれば、いい感じでログに出力をしてくれていましたが、CakePHP4からは「var_export()」を利用して出力する必要があります。
「var_export()」を付けないと下記のエラーが発生します。
「Cake\Controller\Controller::log(): Argument #1 ($message) must be of type string, array given, called in C:\xampp\htdocs\src\Controller\SamplesController.php on line 333
」
また、「var_export()」の第二引数の「true」もお忘れなきよう。
さらに「var_export()」についてもう少し詳しく知りたい、「print_r」「var_dump」と何が違うの?と思った方は下記に解説記事を書いていますので併せて参考にしてください。
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
CakePHP4の関連記事
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3でテーブルのアソシエーションしたデータの取得をコントローラー側でINNERかLEFTを指定する方法を解説。TableファイルにINNERで指定していてもController側で変更ができる。
-
-
CakePHP3、CakePHP4、CakePHP5のバージョンを指定してインストールする詳細な手順を解説
CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。
-
-
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。
-
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。
-
-
CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。
-
-
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。
-
-
CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)
CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。
-
-
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!
-
-
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。