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自身)で対応して貰えれば一番良いですけどね。;-)
- Newer: Twitterで一人言
- Older: Firecakeのコメントにcakeinfoが
コメント (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

