CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
2019/04/06
$this->log()を使ってログファイルを出力する
コントロールやモデル内の変数はログファイルに出力しよう
CakePHP3で開発を行う際、変数の中身を確認したい、と思う場面は多々あるでしょう。
ビューのテンプレート上で扱っている変数であれば、そのまま「echo()」関数や「print_r()」関数を使うことで簡単に確認することができます。
ですが、コントローラーや、モデルの中にある変数などは「echo()」関数などで気軽に確認することができません。
そんなときに活用するのがログファイルへの出力です。
$this->log()を使ってログ出力する方法
エラーログとして出力する
CakePHP3では、ログファイルへの出力は、下記の様に記述をします。
記述するファイルはコントロールファイルや、モデルの Entityや Tableのファイルに記述をします。
下記の様に記述すると、エラーログに「エラーログを出力します。」のメッセージが出力されます。
1 2 |
$this->log("エラーログを出力します。"); $this->log("エラーログを出力します。", "error"); |
出力されるログファイルは、デフォルトの設定では下記のファイルになります。
/logs/error.log
デバッグログとして出力する
デバッグログに出力する場合は、下記の様に第 2引数に「”debug”」「LOG_DEBUG」のいずれかを指定します。
1 2 |
$this->log("エラーログを出力します。", "debug"); $this->log("エラーログを出力します。", LOG_DEBUG); |
$this->log() のログ出力が便利な理由は、変数であっても配列(連想配列も含む)であっても、オブジェクトであっても、プログラマー側が特に気にすることなく何でも出力してくれることです。
先の例では、固定のテキストを出力するように記述していますが、下記の様に、変数を指定することもできます。
requestデータですので、POSTで値を送信したときは、配列として値を受け取りますが、それも「print_r()」関数で表示したときのような形で配列を展開してログに出力してくれます。
1 |
$this->log($this->request->data, LOG_DEBUG); |
出力されるログファイルは、デフォルトの設定では下記のファイルになります。
/logs/debug.log
データベースへのアクセスクエリーをログとして出力する方法
CakePHP 3.6以降では、データベースへアクセスしたクエリーをログとして出力する方法が用意されています。
/config/app.php の 335行目あたりに下記の設定があります。
デフォルトでは、この処理は有効になっていません。
1 2 3 4 5 6 7 8 |
// To enable this dedicated query log, you need set your datasource's log flag to true 'queries' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'queries', 'url' => env('LOG_QUERIES_URL', null), 'scopes' => ['queriesLog'], ], |
これを有効にするには、/config/app.php の 245行目あたりから始まる「Datasources」というデータベースの接続情報などを設定する箇所の「'log' => false,
」を変更します。
1 2 3 4 5 |
// ログを出力しない場合(デフォルト設定) 'log' => false, // ログを出力する場合 'log' => true, |
ログファルは、「/logs/queries.log」として出力されます。
ただ、データベースにアクセスするすべてのログが出力されますので、大量のログが出力されます。
そのため、これを出力するのは開発のときだけにして、本番運用に際しては必要に応じてログを出力する独自のログ出力を検討した方がいいでしょう。
独自設定のログファイルを出力する方法
前項は、既存のログファイルにデバッグ用の値を出力することを想定した内容になっています。
この項では、本番運用に際して、独自設定のログファイルを設定し、そこに必要な情報を出力する方法を解説します。
(CakePHP 3.6で動作確認をしています。CakePHP 3.6より前のバージョンの場合は、下の方にある「CakePHP 3.4以前のバージョンの場合?」を参照してください。)
/config/app.php の編集
/config/app.php の 315行目あたりから始まるログの設定箇所に、下記の 27~33行目の処理を追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
'Log' => [ 'debug' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'debug', 'url' => env('LOG_DEBUG_URL', null), 'scopes' => false, 'levels' => ['notice', 'info', 'debug'], ], 'error' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'error', 'url' => env('LOG_ERROR_URL', null), 'scopes' => false, 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], ], // To enable this dedicated query log, you need set your datasource's log flag to true 'queries' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'queries', 'url' => env('LOG_QUERIES_URL', null), 'scopes' => ['queriesLog'], ], 'operation' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'operation_log', 'scopes' => ["operation_log"], 'levels' => [], ], ], |
'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より前のバージョンでこの設定がない場合はこの記述を追加します。)
1 |
'scopes' => false, |
ログ出力のレベルに関して
ログ出力のレベルは、下記に設定されているとおりです。
- 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句を追加します。
1 |
use Cake\Log\Log; |
続いて、ログを出力する処理である 9行目を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function add() { $topic = $this->Topics->newEntity(); if ($this->request->is('post')) { $topic = $this->Topics->patchEntity($topic, $this->request->getData()); if ($this->Topics->save($topic)) { // ログ出力追加 Log::info($this->Topics->save($topic), "operation_log"); $this->Flash->success(__('The topic has been saved.')); return $this->redirect(['action' => 'index']); } $this->Flash->error(__('The topic could not be saved. Please, try again.')); } $this->set(compact('topic')); } |
「Log::info();
」でログを出力します。
1つ目のパラメーターに出力する値を編集します。固定値でも変数でも配列でもオブジェクトでも設定できます。
2つ目のパラメーターには、ログの出力先としてログファイルの設定で決めた「scopes」の値を指定します。今回のサンプルでは「operation_log」を設定していましたので、これを指定します。
これで、Topicsの登録画面からレコードを登録するとログが出力されます。
「CakePHP 3.4以前のバージョンの場合?」
以下は以前書いていた内容です。
CakePHP 3.6以降では前項の設定で動作しましたが、それより前のバージョンでは動作するかどうか分かりませんので、CakePHP 3.6より前のバージョンで動作しない場合は、下記を参照してください。
ログ出力に関する設定
ログ出力に関する設定は、以下のファイルに記述してあります。
/config/app.php
記述してある内容の標準形式は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'Log' => [ 'debug' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'debug', 'levels' => ['notice', 'info', 'debug'], 'url' => env('LOG_DEBUG_URL', null), ], 'error' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'error', 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], 'url' => env('LOG_ERROR_URL', null), ], ], |
その中から、例えば、「info」のエラーレベルだけを違うログファイルに出力しようと考える場合には、下記の様に、「debug」の「lavels」の中から「info」を取り出し、「info_log」というログファイル出力の設定をするといいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'Log' => [ 'debug' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'debug', 'levels' => ['notice', 'debug'], 'url' => env('LOG_DEBUG_URL', null), ], : 中略 : 'info_log' => [ 'className' => 'Cake\Log\Engine\FileLog', 'path' => LOGS, 'file' => 'info_log', 'levels' => ['info'], 'url' => env('LOG_DB_ERROR_URL', null), ], ], |
「info」レベルの出力が発生した場合は、infoログに出力されるようになります。
また、「info」レベルのログを出力する場合は、下記の様に $this->log()の第 2引数に「info」を指定することで対応が可能になります。
1 2 |
$this->log($this->request->data, "info"); $this->log($this->request->data, LOG_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の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP 2.3 Search Pluginで検索処理 その1設置方法
CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。
-
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4のシステムから他のシステムのデータベースにアクセスをし、SQL文を実行する方法を解説。try-catchでエラーを取得する方法も解説。
-
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。
-
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
CakePHP4で定数の設定と呼び出し方法の解説(defineとConfigure)
CakePHP4で定数を設定、使用する方法を解説。定数定義はdefineとConfigureを使用する方法を解説。また、bootstrap.phpに直接記述する方法と別のファイルにする方法を解説。
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。