2009-05-23 15 views
4

Ich wollte wissen, ob es eine Möglichkeit gibt, die mysql-Abfragen in CakePHP zu protokollieren, die ausgeführt wird, wenn wir die Methode find für die Modelle verwenden, weiß ich, dass Rails Datenbankabfragen, so tut Cake das gleiche, wenn Wie kann ich es aktivieren oder verwenden?MySQL Query Logging in CakePHP

Shiv

Antwort

1

Vorausgesetzt, dass Sie auf einem nix os sind, ist der beste Ansatz würde sich tatsächlich bis zum Schwanz log die mysql.
Sie könnten einige interessante Dinge daraus lernen.

log in Ubuntu, wenn aus dem Repository Installation

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

Wie weiter unten erwähnt, ist dies eine enorme Leistungskiller (na ja, alle Protokolle einige Auswirkungen auf die Leistung haben). Stellen Sie sicher, dass Sie es nur auf Ihren Dev/QA-Maschinen und nur für kurze Zeit auf Ihrer Produktionsmaschine verwenden.

+0

keine Möglichkeit, es von CakePHP zu protokollieren, wie wir benutze $ this-> log – Shiv

+1

standardmäßig, mysql.log ist deaktiviert, weil es ein riesiger Performance Killer ist, Du musst es von my.cnf deaktivieren und das nur in der Entwicklungsumgebung tun! – duckyflip

6

This page enthält Anweisungen, wie Cake Abfragen auf die gleiche Weise wie Schienen protokolliert werden kann.

1

CakePHP 1.3 verwendet das Element sql_dump dafür.
können Sie das Element direkt verwenden, wenn Configure::read('debug')-2 gesetzt:

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

Oder nehmen Sie es Code ist direkt, wenn Sie etwas anderes damit tun müssen (wie echo es von einem ShellTask)

$sources = ConnectionManager::sourceList(); 

$logs = array(); 
foreach ($sources as $source): 
    $db =& ConnectionManager::getDataSource($source); 
    if (!$db->isInterfaceSupported('getLog')): 
     continue; 
    endif; 
    $logs[$source] = $db->getLog(); 
endforeach; 

Echo mit zB:

print_r($logs) 
1

Das ist, was ich benutze (steckte es in Element Ordner enthalten dann in Ihrem Layout)

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

dann werden Sie die mysql.log Datei in TMP.logs.DS.mysql.log finden

4

eine sehr einfache Methode, um alle Anfragen zu protokollieren ausgeführt wird:

in Ihrem Kuchen \ libs \ model \ Datenquellen \ dbo \ dbo_mysql.php

finden die _EXECUTE Funktion:

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

fügen Sie die Zeile "$ this-> log ($ sql); "vorher" Rückgabe mysql_query ($ sql, $ this-> Verbindung); "

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

Das ist es !!!!! Alle Ihre SQL-Abfragen protokolliert wird. Stellen Sie sicher, dass die Protokolldatei ordnungsgemäß konfiguriert ist und über ausreichende Berechtigung haben. Genießen Sie

+2

Es ist eine schlechte Übung, direkt zu ändern Core CakePHP-Code Diese Methode sollte vermieden werden.Wenn Sie das Verhalten von Cake ändern möchten, erweitern Sie es in Ihrem App-Verzeichnis. – drmonkeyninja