エス技研

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


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

      2019/04/06

$this->log()を使ってログファイルを出力する

 

コントロールやモデル内の変数はログファイルに出力しよう

 
CakePHP3で開発を行う際、変数の中身を確認したい、と思う場面は多々あるでしょう。
 
ビューのテンプレート上で扱っている変数であれば、そのまま「echo()」関数や「print_r()」関数を使うことで簡単に確認することができます。
 
ですが、コントローラーや、モデルの中にある変数などは「echo()」関数などで気軽に確認することができません。
 
そんなときに活用するのがログファイルへの出力です。
 
 

$this->log()を使ってログ出力する方法

 

エラーログとして出力する

 
CakePHP3では、ログファイルへの出力は、下記の様に記述をします。
記述するファイルはコントロールファイルや、モデルの Entityや Tableのファイルに記述をします。
 
下記の様に記述すると、エラーログに「エラーログを出力します。」のメッセージが出力されます。
 

 
出力されるログファイルは、デフォルトの設定では下記のファイルになります。
 /logs/error.log
 
 

デバッグログとして出力する

 
デバッグログに出力する場合は、下記の様に第 2引数に「”debug”」「LOG_DEBUG」のいずれかを指定します。
 

 
$this->log() のログ出力が便利な理由は、変数であっても配列(連想配列も含む)であっても、オブジェクトであっても、プログラマー側が特に気にすることなく何でも出力してくれることです。
 
先の例では、固定のテキストを出力するように記述していますが、下記の様に、変数を指定することもできます。
requestデータですので、POSTで値を送信したときは、配列として値を受け取りますが、それも「print_r()」関数で表示したときのような形で配列を展開してログに出力してくれます。
 

 
出力されるログファイルは、デフォルトの設定では下記のファイルになります。
 /logs/debug.log
 
 

データベースへのアクセスクエリーをログとして出力する方法

 
CakePHP 3.6以降では、データベースへアクセスしたクエリーをログとして出力する方法が用意されています。
 
/config/app.php の 335行目あたりに下記の設定があります。
デフォルトでは、この処理は有効になっていません。
 

 
これを有効にするには、/config/app.php の 245行目あたりから始まる「Datasources」というデータベースの接続情報などを設定する箇所の「'log' => false,」を変更します。
 

 
ログファルは、「/logs/queries.log」として出力されます。
 
ただ、データベースにアクセスするすべてのログが出力されますので、大量のログが出力されます。
そのため、これを出力するのは開発のときだけにして、本番運用に際しては必要に応じてログを出力する独自のログ出力を検討した方がいいでしょう。
 
 


 
 

独自設定のログファイルを出力する方法

 
前項は、既存のログファイルにデバッグ用の値を出力することを想定した内容になっています。
 
この項では、本番運用に際して、独自設定のログファイルを設定し、そこに必要な情報を出力する方法を解説します。
(CakePHP 3.6で動作確認をしています。CakePHP 3.6より前のバージョンの場合は、下の方にある「CakePHP 3.4以前のバージョンの場合?」を参照してください。)
 
 

/config/app.php の編集

 
/config/app.php の 315行目あたりから始まるログの設定箇所に、下記の 27~33行目の処理を追記します。
 

 
'className' => 'Cake\Log\Engine\FileLog',
ログ出力処理を行うクラスを指定します。
上記は完全な namespaceまで記述した方法ですが、「'className' => 'File',」のように短い名称でも同じ設定内容になります。
 
'path' => LOGS,
ログファイルを出力する場所を指定します。
デフォルトの「LOGS」では「/logs」フォルダに出力されます。
専用のフォルダにログ出力したい場合は、「'path' => LOGS . "operation/",」のように指定します。
このときの注意ポイントは「operation/」の最後の「/」を必ず設定することです。これがないとフォルダが正しく指定されていないこととなり、ログが出力されません。
ちなみに、「operation」フォルダがない場合は、自動的に生成されますので、あらかじめ作っていなくても問題ありません。
 
'file' => 'operation_log',
出力するログファル名を指定します。
「operation_log」を指定すると「operation_log.log」というファイルにログが出力されます。
拡張子は必ず「.log」となります。拡張子は指定する必要はありません。ファイル名に「.log」を付けても付けていなくても結果は変わりません。
ちなみに、「operation_log.aaa」のように記述すると、「operation_log.aaa.log」というログファイルが生成されます。
 
ちなみに、固定値ではなく「'file' => date("Y-m-d"),」のようにその日の日付のログファイルを作成するように指定することもできます。
 
'scopes' => ["operation_log"],
ここで設定したログファイルにログを出力する際に指定する値です。
重複せずに分かりやすい文字列を指定します。
 
'levels' => [],
今回は、「scopes」で「operation_log」を指定して出力するため、「levels」は指定しません。
 
 
また、CakePHP 3.6以降では、「debug」「error」の設定の 7行目、15行目に下記の設定が追加されています。
この設定がないと、独自ログファイルに出力しているはずのログが、デフォルトで設定してある「debug」「error」にも出力されてしまうためです。
独自ログは独自ログだけに出力されるように、この設定があります。(CakePHP 3.6より前のバージョンでこの設定がない場合はこの記述を追加します。)

 
 

ログ出力のレベルに関して

 
ログ出力のレベルは、下記に設定されているとおりです。
 

  • Emergency:システムは使用出来ません
  • Alert:今すぐ行動する必要がある
  • Critical:致命的な状態
  • Error:エラー状態
  • Warning:警告状態
  • Notice:正常であるが、重大な状態
  • Info:インフォメーションメッセージ
  • Debug:デバッグレベルメッセージ

 
詳しくは以下に書かれていますが、「'levels' => [],」に指定することで、該当の処理が発生したときに指定したログファイルにその内容を出力します。
 
詳しくは下記の Cookbookを参照してください。
https://book.cakephp.org/3.0/ja/core-libraries/logging.html#logging-levels
 
 

/src/Controller/TopicsController.php の編集

 
続いて、実際にログを出力する箇所に処理を追加します。
今回は、Topicsというコントローラーの add()アクションにログ出力を追加する想定です。
 
追加するファイルは、下記になります。
/src/Controller/TopicsController.php
 
 
まず、ファイルの先頭あたりに use句を追加します。
 

 
 
続いて、ログを出力する処理である 9行目を追加します。
 

 
Log::info();」でログを出力します。
1つ目のパラメーターに出力する値を編集します。固定値でも変数でも配列でもオブジェクトでも設定できます。
2つ目のパラメーターには、ログの出力先としてログファイルの設定で決めた「scopes」の値を指定します。今回のサンプルでは「operation_log」を設定していましたので、これを指定します。
 
これで、Topicsの登録画面からレコードを登録するとログが出力されます。
 
 

「CakePHP 3.4以前のバージョンの場合?」

 
以下は以前書いていた内容です。
CakePHP 3.6以降では前項の設定で動作しましたが、それより前のバージョンでは動作するかどうか分かりませんので、CakePHP 3.6より前のバージョンで動作しない場合は、下記を参照してください。
 
 

ログ出力に関する設定

 
ログ出力に関する設定は、以下のファイルに記述してあります。
 /config/app.php
 
記述してある内容の標準形式は以下のようになっています。
 

 
その中から、例えば、「info」のエラーレベルだけを違うログファイルに出力しようと考える場合には、下記の様に、「debug」の「lavels」の中から「info」を取り出し、「info_log」というログファイル出力の設定をするといいでしょう。
 

 
「info」レベルの出力が発生した場合は、infoログに出力されるようになります。
 
また、「info」レベルのログを出力する場合は、下記の様に $this->log()の第 2引数に「info」を指定することで対応が可能になります。
 

 
この場合、出力されるログファイルは、下記のファイルになります。
 /logs/info_log.log
 
 

ログ出力に関するまとめ

 
プログラムを開発するにあたって、変数の中にどういう値が入っているか、それはデバッグをする上で非常に重要なポイントです。
 
なので、簡単に変数の中身を見る方法を確保することは、プログラム開発スピードを向上させてくれるでしょう。
 
CakePHP2では「CakePHP 2.3 Model、Controllerの見たい変数の中身をログ出力」に記事に書いたとおりの方法なのですが、CakePHP3になっても大きな変化はなく「$this->log()」を使うことでログファイルに変数の情報を出力できますので、積極的に活用していきましょう。
 
 
ちなみに、マニュアルは下記のページにあります。
ログ出力の詳細については英語のページしか見つからず、細かなところまではまだ確認しきれていませんが、そのうち日本語のページができてくることを願っています!
https://book.cakephp.org/3.0/en/core-libraries/logging.html#writing-to-logs
 
https://book.cakephp.org/3.0/ja/development/debugging.html
 
 

CakePHP3の関連記事

CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
cakephp3 カスタムバリデーションを簡易的に実装する方法
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説

CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。

MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認

MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。

CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2
CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその2でバリデーションなどの実用的なカスタマイズ方法を解説。

CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその1で基本的な導入方法の解説で読みながら簡単に導入が可能。

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

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

CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用

CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。

CakePHP 2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法

CakePHPの検索プラグイン Search Pluginの検索処理の中で動的に表示件数を変える方法です。

CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定

CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。

CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得

URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。