2009-05-23 15 views
4

モデルでfindメソッドを使用するときに実行されるCakePHPでmysqlクエリをログに記録する方法があるかどうかを知りたかったので、レールデータベースクエリを知っていました。どのように私はそれを有効にするか、それを使用することができますか?MySQLクエリのCakePHPへのログイン

シブ

答えて

1

あなたはnixのOS上にあると仮定すると、最善のアプローチは、実際には最後尾にmysqlのは、自分自身が記録されます。
あなたはそれからいくつかの興味深いことを学ぶかもしれません。後述するように、リポジトリ

tail -f /var/log/mysql/mysql.log 

からインストールする際のUbuntuで

ログは、これは巨大な性能キラー(ウェル、すべてのログは、いくつかのパフォーマンスに影響を持っている)です。ですから、あなたのdev/QAマシンでのみ、また本番機では短期間だけ使用してください。

+0

CakePHPのからそれをログに記録する方法をお楽しみくださいません$ this-> log – Shiv

+1

をデフォルトで使用してください。これは巨大なパフォーマンスキラーであるため、mysql.logは無効になっています。my.cnfから無効にし、dev。環境でのみ行う必要があります。 – duckyflip

6

This pageには、Cakeがレールと同じようにクエリをログに記録する方法が記載されています。

1

CakePHP 1.3では、sql_dump要素が使用されています。

$sources = ConnectionManager::sourceList(); 

$logs = array(); 
foreach ($sources as $source): 
    $db =& ConnectionManager::getDataSource($source); 
    if (!$db->isInterfaceSupported('getLog')): 
     continue; 
    endif; 
    $logs[$source] = $db->getLog(); 
endforeach; 
(のようなShellTask​​からそれをエコー)

echo $this->element('sql_dump'); 

それともあなたはそれで何かを行う必要がある場合、それは直接コードです取る:
あなたはConfigure::read('debug')が2に設定されている要素を直接使用することができます例えばと

エコー:

print_r($logs) 
1

これは私が使用するものである(あなたのレイアウトに含めるその要素のフォルダに入れて)

<?php 
    ob_start(); 
    echo $this->element('sql_dump'); 
    $out = ob_get_contents(); 
    ob_end_clean(); 
    CakeLog::write('mysql' , $out); 
?> 

、あなたはTMP.logs.DS.mysql.log

4

でmysql.logファイル、実行中のすべてのクエリをログに記録することは非常に簡単な方法でしょう。あなたのケーキに

を\ LIBS \モデル\データソース\ DBO \

dbo_mysql.php _EXECUTE機能を見つける:

function _execute($sql) { 
     return mysql_query($sql, $this->connection); 
} 

行に「$ this-> log($ sql);」という行を追加します。 "before" return mysql_query($ sql、$ this-> connection);それだ

function _execute($sql) { 
    $this->log($sql); 
    return mysql_query($sql, $this->connection); 
} 

!!!!!あなたのすべてのSQLクエリが記録されます。ログファイルが正しく設定され、十分な権限を持っていることを確認します。私たちのように、

+2

直接変更するのは悪い習慣ですコアのCakePHPコード。このメソッドは避けなければなりません。もしCakeの振る舞いをあなたのappディレクトリに変更したいのなら。 – drmonkeyninja