Para fazer um log de queries executadas pelo Doctrine você pode usar a classe Doctrine_Connection_Profiler, esta classe ira atuar como ouvidora de eventos realizados pela Doctrine_Connection.
Escrevi uma função para isso, para usa-la você ira precisar habilitar o connection profiler, faça o seguinte em seu bootstrap:
$manager = Doctrine_Manager::getInstance();
$profiler = new Doctrine_Connection_Profiler();
$manager->setListener($profiler);
Se estiver usando o bootstrap do post de introdução ao doctrine isso já foi feito. Esta é a função:
<?php
function doctrineLog($logFile = 'php://stdout', $marcador = 'CONNECTION', $dateFormat = 'd-m-Y h:i:s')
{
$tempo = 0;
$eventos = $acoes = array();
$logfp = fopen($logFile, 'a');
if(!is_resource($logfp))
return false;
$profiler = Doctrine_Manager::getInstance()
->getCurrentConnection()->getListener();
fprintf($logfp, "[%s] [START %s]n", date($dateFormat), $marcador);
foreach ($profiler as $event) {
$nomeEvento = $event->getName();
$eventos[$nomeEvento] = isset($eventos[$nomeEvento]) ?
++$eventos[$nomeEvento] : 1;
$tempo += $event->getElapsedSecs();
if($nomeEvento == 'query' or $nomeEvento == 'execute') {
fprintf($logfp, "[%s] [Parâmetros] "%s" [Duração] %f [Query] %sn",
date($dateFormat), join('", "', (array) $event->getParams()),
$event->getElapsedSecs(), $event->getQuery() );
}
}
$eventos['query'] += $eventos['execute'];
foreach($eventos as $k => $v)
$acoes[] = sprintf('%s %s', $v, $k);
fprintf($logfp, "[%s] [Ações] %s [Tempo Total] %f n",
date($dateFormat), join(', ', $acoes), $tempo);
fprintf($logfp, "[%s] [END %s]n", date($dateFormat), $marcador);
fclose($logfp);
}
Agora invoque a função onde quiser:
<?php
require 'bootstrap.php';
// incluir a função
require 'functions.php';
$actorTable = Doctrine::getTable('Actor');
$actor = $actorTable->find(155);
$julia = $actorTable->findOneBy('first_name', 'Julia');
$customerTable = Doctrine::getTable('Customer');
$customers = $customerTable->findAll();
// imprimir log de queries executadas até aqui
echo '<pre>';
doctrineLog('php://output');
echo '</pre>';
$cityTable = Doctrine::getTable('City');
$citys = $cityTable->findAll();
$city = $cityTable->findOneBy('city', 'London');
$filter = Doctrine_Query::create()
->from('Actor a')
->leftJoin('a.Filmes f')
->where('a.actor_id = ? AND f.rating = ?')
->execute(array(68, 'PG-13'));
// log em um arquivo comum
doctrineLog('log/querylog.txt');
// log em um arquivo compactado com gzip
doctrineLog('compress.zlib://' . dirname(__FILE__) . '/log/querylog.gz');
?>
Resultaria em:
[15-04-2010 19:22:36] [START CONNECTION]
[15-04-2010 19:22:36] [Parâmetros] "155" [Duração] 0.000205 [Query] SELECT a.actor_id AS a__actor_id, a.first_name AS a__first_name, a.last_name AS a__last_name, a.last_update AS a__last_update FROM actor a WHERE (a.actor_id = ?) LIMIT 1
[15-04-2010 19:22:36] [Parâmetros] "Julia" [Duração] 0.000185 [Query] SELECT a.actor_id AS a__actor_id, a.first_name AS a__first_name, a.last_name AS a__last_name, a.last_update AS a__last_update FROM actor a WHERE (a.first_name = ?) LIMIT 1
[15-04-2010 19:22:36] [Parâmetros] "" [Duração] 0.000647 [Query] SELECT c.customer_id AS c__customer_id, c.store_id AS c__store_id, c.first_name AS c__first_name, c.last_name AS c__last_name, c.email AS c__email, c.address_id AS c__address_id, c.active AS c__active, c.create_date AS c__create_date, c.last_update AS c__last_update FROM customer c
[15-04-2010 19:22:36] [Ações] 1 connect, 2 prepare, 2 execute, 4 fetch, 3 query [Tempo Total] 0.014827
[15-04-2010 19:22:36] [END CONNECTION]
O log irá para a saída padrão do PHP ou para outro arquivo como no exemplo. Esta função apenas registra o log em um arquivo então você pode criar sua “estratégia” para fazer os log’s.