ちょっとした技術メモを忘れないうちに書いていく

CakePHP3のログ出力

2019-10-25

デフォルト設定のままでいいのでは?


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で出力される

目次