CakePHP3 で色々作るに当たって、デバッグ用にログ機能のドキュメントを読んだのでメモ。
デフォルトのログ出力
現時点(3.8.4)ではデフォルトでログ関数(Log::info など)を使い出力ができます。
ログレベルの種類 ↑ エラーなど緊急性の高いログ
- emergency
- alert
- critical
- error
- warning
- notice
- info
- debug
↓ デバッグなど緊急性の低いログ
ログの出力の仕方
// Logオブジェクトをロード
use Cake\Log\Log;
/*
classやfunctionの記述
*/
// 第1引数にレベルを指定して出力
Log::write('debug','writeで出力');
// レベルごとに定義されている関数で出力
Log::info('infoとして出力');
// 第2引数にレベルを指定して出力(省略するとerrorが設定される)
$this->log("logで出力", 'critical');
このソースを実行すると logs ディレクトリの debug.log と error.log に出力される。
logs/debug.log
2019-10-24 08:42:19 Debug: writeで出力
2019-10-24 08:42:19 Info: infoとして出力
logs/error.log
2019-10-24 08:42:19 Critical: logで出力
デフォルトのログの設定箇所
デフォルト設定の読み込みは bootstrap.php で行っている。
bootstrap.php
Log::setConfig(Configure::consume('Log'));
この設定内容を見てみると debug には notice、info、debug、 error には warning、error、critical、alert、emergency が出力されるようになっている。
[
'debug' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => '/var/www/html/app/logs/',
'file' => 'debug',
'url' => null,
'scopes' => false,
'levels' => [
(int) 0 => 'notice',
(int) 1 => 'info',
(int) 2 => 'debug'
]
],
'error' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => '/var/www/html/app/logs/',
'file' => 'error',
'url' => null,
'scopes' => false,
'levels' => [
(int) 0 => 'warning',
(int) 1 => 'error',
(int) 2 => 'critical',
(int) 3 => 'alert',
(int) 4 => 'emergency'
]
],
'queries' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => '/var/www/html/app/logs/',
'file' => 'queries',
'url' => null,
'scopes' => [
(int) 0 => 'queriesLog'
]
]
]
SQL のログ出力
デフォルトのログ設定の queries は実行した SQL を出力することができる。 出力するには app.php で指定している Datasources の DB 設定で log に true を設定する。
app.php
'Datasources' => [
'default' => [
'className' => Connection::class,
'driver' => 'Cake\Database\Driver\Postgres',
'persistent' => false,
'host' => 'cakephp_test_cakephp_db_1',
'username' => 'postgres',
'password' => 'password',
'database' => 'test_db',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => true,
この状態で SQL を実行すると logs/querie.log が作成され、実行日時と SQL が出力される。
logs/querie.log
2019-10-24 08:01:08 Debug: duration=2 rows=1 SELECT Records.id AS "Records__id", Records.name AS "Records__name", Records.created AS "Records__created", Records.modified AS "Records__modified" FROM records Records WHERE Records.id = 1 LIMIT 1
2019-10-24 08:20:40 Debug: duration=21 rows=4 SELECT DISTINCT table_schema AS schema,
column_name AS name,
data_type AS type,
is_nullable AS null, column_default AS default,
app.php 以外でも SQL ログ出力の ON/OFF 設定が可能
use Cake\Datasource\ConnectionManager;
$conn = ConnectionManager::get('default');
$conn->logQueries(true); //trueで出力される