CakePHP3でSQLのログをInfoレベルで出力する

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']);
    }
}

以上です。