Para fazer um log de querys 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:
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] %s\n", 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'); // busca pela chave primaria $actor = $actorTable->find(155); // busca por uma coluna $julia = $actorTable->findOneBy('first_name', 'Julia'); $customerTable = Doctrine::getTable('Customer'); $customers = $customerTable->findAll(); // imprimir log de querys 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 registra o log em um arquivo então você pode criar sua “estratégia” para fazer os log’s.