CakePHP3でSQLをログ出力するのは大変簡単です。
以下のCakePHP3公式リファレンスに記載されております。
データベースの基本
一番簡単な方法としては、”Config/app.php”の”Datasources”に”log”とありますので、これをtrueにすることです。そうすると自動でSQLがログ出力されます。
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => '127.0.0.1',
/**
* CakePHP will use the default DB port based on the driver selected
* MySQL on MAMP uses port 8889, MAMP users will want to uncomment
* the following line and set the port accordingly
*/
//'port' => 'nonstandard_port_number',
'username' => 'username',
'password' => 'password',
'database' => 'database',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'log' => false,
一部のSQLだけログ出力して確認したくなったときは、”Cake\Database\Connection::logQueries(true)”でログ出力がコントロールできます。
$conn->logQueries(true);
// 出力されるSQL
$conn->logQueries(false);
// 出力されないSQL
はじめの”log”フラグは”logQueries(true)”が呼ばれっぱなしになるものです。
公式には以下のように注意書きが有りました。ご注意ください。
クエリログは、デバッグまたは開発用途での利用を想定しています。 アプリケーションのパフォーマンスに悪影響を及ぼしますので、公開サイトでは 利用すべきではありません。
デフォルトではDebugでログ出力されます。何かの需要があるかも知れませんので、Infoレベルでログ出力する方法を書きます。
$connection = ConnectionManager::get('default');
$connection->logger(new QueryLoggerCustom());
$connection->logQueries(true);
それから以下にファイルを追加します。
vendor/cakephp/cakephp/src/Database/Log/QueryLoggerCustom.php
namespace Cake\Database\Log;
use Cake\Log\Log;
/**
* This class is a bridge used to write LoggedQuery objects into a real log.
* by default this class use the built-in CakePHP Log class to accomplish this
*
* @internal
*/
class QueryLoggerCustom extends QueryLogger
{
/**
* Wrapper function for the logger object, useful for unit testing
* or for overriding in subclasses.
*
* @param LoggedQuery $query to be written in log
* @return void
*/
protected function _log($query)
{
Log::write('info', $query, ['queriesLog']);
}
}
以上です。