Home > CakePHP | PHP > CakePHP SQLをログに記録

CakePHP SQLをログに記録

この記事の所要時間: 227

CakePHPで発行したSQLをログに記録する方法です。

DEBUG>=2にすれば画面下に表示されるSQL文ですが、DB処理後にリダイレクト等で遷移すると消えてしまいます。さらに本番稼働時は画面に表示するわけにはいかないのでやはりログに出力したいところです。

フレームワークに手を入れるのが一番簡単なのですが、バージョンが上がると面倒なので既存のDboSourceを継承したクラスにログ記録を追加します。

1. DboSourceを継承

dboはフレームワークで用意されているものだけでなく、app/model/dboにあるものもフレームワークで利用する事ができます。

ここではPostgreSQLを使うとしてDboPostgresを継承したDboPostgresLogを作ります。

ログ出力をON/OFFする定数LOG_SQLは後でcore.phpで定義します。

[app/model/dbo/dbo_postgres_log.php]

<?php
uses ('model' . DS . 'dbo' . DS . 'dbo_postgres');

class DboPostgresLog extends DboPostgres {
  /**
   * @var integer
   */
  var $queryNo = 1;

	function execute($sql) {
    $ret = parent::execute($sql);

    if (defined('LOG_SQL') && LOG_SQL) {
      $this->log(sprintf("%d. %s", $this->queryNo, $sql), LOG_DEBUG);
      $this->queryNo++;
    }

    return $ret;
	}
}
?>

2. 作成したDboPostgresLogを使用する

DATABASE_CONFIGのDB設定でdriverを’postgres_log’を指定します。

[app/config/database.php]

class DATABASE_CONFIG
{
  var $default = array('driver' => 'postgres_log',
                       'connect' => 'pg_connect',
                       'host' => 'localhost',
                       'login' => 'user',
                       'password' => 'pass',
                       'database' => 'foo',
                       'prefix' => '');
}

3. core.phpでLOG_SQLを定義

SQLをログに出力するか否かを設定するLOG_SQLをcore.phpで定義します。

LOG_SQLがtrueならSQL出力し、LOG_SQLが未定義もしくはfalseの場合は出力しません。

[app/config/core.php]

<?php
/**
 * If set to true, logging sql queries
 */
	define('LOG_SQL', true);
?>

これで実行されたSQL文が[app/tmp/logs/debug.log]に出力されます。

この方法はDEBUGの値に関係無くログ出力ができるのは良いのですが、DboSourcesを継承するのがイマイチです。フレームワーク(DboSources自身)で対応して貰えれば一番良いですけどね。;-)

Pocket

follow us in feedly

コメント (Close):4

p4life 07-04-07 (土) 12:18

beforeExecute(), afterExecute() みたいなフックがほしいですよね.面倒なので直接 cake のコードに手を加えてしまいました.

shinbara 07-04-09 (月) 18:29

どうもです。フックを付けるという案もありですね。
ここはAOPの出番でしょうか。;-)

あつ 07-12-16 (日) 1:39

「1. DboSourceを継承」のファイル名ですが、「app/model/dbo/dbo_postgres_log.php」ではなくて、「app/models/dbo/dbo_postgres_log.php」じゃないですか?

mighty_5 11-08-16 (火) 11:06

CakePHP1.3では、ディレクトリ構成が若干変わっているんですね。
参考にさせていただきながら(ありがとうございます!おかげで目的通りになりました)、それに合わせて設定する必要がありますので、見に来られた方々への参考までに追加コメント。

\app\models\datasources\dbo\
ここに目的のスクリプトを配置。

uses (‘model’ . DS . ‘datasources’ . DS . ‘dbo’ . DS . ‘dbo_postgres’);
と書き換えておけば、動くはずです。

私はMySQL派なんで、いづれMySQLiバージョンを自分のブログに書き残しておこうかな。

トラックバック:0

このエントリーのトラックバックURL
/blog/2007/04/cakephp_sql_log.html/trackback
Listed below are links to weblogs that reference
CakePHP SQLをログに記録 from Shin x blog

Home > CakePHP | PHP > CakePHP SQLをログに記録

検索
フィード
メタ情報

Return to page top