Como fazer log de query’s do doctrine

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.

Leave a Reply