エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説

      2024/06/27

CakePHP4で独自のログファイルを作成してログ出力方法を解説

 
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法や、新しいログ出力のファイルを設定する方法を解説します。
 
 

CakePHP4のデフォルトログファイル「debug.log」「error.log」にログ出力する方法

 
CakePHP4では、デフォルトで「debug.log」「error.log」「queries.log」のログが用意されています。
 
コントローラーに下記のように記述すると、それぞれ「debug.log」「error.log」にログ出力をすることができます。
 

 
第一引数がメッセージで、第二引数が「ログレベル」による出力先の指定です。
 
この方法は、「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行目の「'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)を指定してログ出力をする場合の処理は、一番最初に記載したように、下記の記述をします。
 
コントローラーに記述する場合は下記になります。
 

 
 
モデルに記述する場合は下記になります。
 

 
use句の「use Cake\Log\Log;」の記述を忘れると、「Class "App\Model\Table\Log" not found」と言うエラーが出力されます。
 
続いて、各処理の中に下記を記述します。
 

 
 

ログレベル(levels)を指定して複数のログに出力をする場合の処理

 

 
上記のように「/config/app.php」に「levels」の設定に「debug」が複数のログ設定にある場合、下記の「debug」のログレベルを指定してログ出力した場合は、「debug.log」「debug2.log」の両方にログ出力されます。
 

 
 

ロギングスコープ(scopes)を指定してログ出力をする場合の処理

 
ロギングスコープ(scopes)を指定してログ出力をする場合の処理は、下記を記述します。
 
 

コントローラーでロギングスコープを指定する方法

 
コントローラーに記述する場合はでは下記を記述します。
 

 
第一引数が、エラーメッセージ。
第二引数が、ログレベル。
第三引数が、その他の設定で、上記は「ログスコープ」を指定しています。
第三引数で指定するスコープは「scopes」で指定した名称です。
上記の例では「sampleError」と記述しているログの名称の方ではありませんのでご注意ください。(とは言え「scopes」の値を「sampleError」と同じ文字列にする場合が多いんですが。)
 
ちなみに、「scope」で指定した値が、「app.php」内の「scopes」で設定しているものに存在しない場合でもエラー等の発生はありません。
もちろんログも出力されませんので、出力されているハズのログが出力されていない場合は「scope」の値が間違っているのかもしれません。
 
 

モデルでロギングスコープを指定する方法

 
モデルでは下記を記述します。
 

 

 
最初の「Log::error」の「error」の部分がエラーレベル。
第一引数が、エラーメッセージ。
第二引数が、その他の設定で、上記は「ログスコープ」を指定しています。
 
 

CakePHP4で配列、オブジェクトを出力する場合は「var_export()」を使用する

 
CakePHP4からは、配列やオブジェクトをログ出力する際に「var_export()」を使用する必要があります。
CakePHP3も CakePHP4も基本的なログの設定方法、出力の指定方法などは変わらないのですが、なぜかこの配列やオブジェクトを直接出力してくれなくなっています。
 

 
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のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説

CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。

CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説

CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。

CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
CakePHP3、CakePHP4のdatetime型カラムの日時の扱い。秒まで表示する方法

CakePHP3の日時カラムで秒まで扱う場合はdate()、strtotime()関数ではうまくいかない。CakePHP3であらかじめ用意された「i18nFormat()」を使用する。

CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因

Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。

CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。

CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法

CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。

CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座

CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。

CakePHP3ログファイルの出力方法・$this->log()の解説
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説

コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。

CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要

CakePHP4でキャッシュをクリアするコマンドcake cache clear_allでPermission deniedのエラーが出るのはcakeにパーミッションが足りないとき。その対処方法を解説。

CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。