tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Logování SQL dotazů do FireLoggeru

před 8 lety

Milo
Nette Core | 1119

Při vývoji s oblibou používám Firebug a FireLogger a to v té nejjednodušší podobě flog($var). Také se mi líbí jak dibi loguje do Firebug konzole. Je to ale trochu na hlavu, stále překlikávat mezi Firebug konzolí a FireLoggerem. Stačí však vlastní malý DibiProfiler, který do FireLoggeru loguje. Navíc podle délky trvání dotazu použije příslušný log level.

<?php

/**
 * Odesílá SQL dotazy do FireLoggeru.
 * @todo  Implementovat FireLogger protokol namísto používání třídy FireLogger.
 *
 * Podle doby trvání SQL dotazu použije příslušný log level.
 *     >= 100ms - critical
 *     >=  15ms - warning
 *     <   15ms - info
 */
class MyDibiProfiler extends DibiProfiler
{
    protected static $flogCnt = 1;

    public function after( $ticket, $res = NULL )
    {
        if (!isset(self::$tickets[$ticket])) {
            throw new InvalidArgumentException('Bad ticket number.');
        }

        list($connection, $event, $sql, $time) = self::$tickets[$ticket];

        parent::after($ticket, $res);

        if (($event & self::QUERY) && (count(self::$fireTable) < self::$maxQueries) && (class_exists('FireLogger', false) && $this->useFirebug)) {
            for ($i = self::$flogCnt++; $i < count(self::$fireTable); $i++) {
                $row = & self::$fireTable[$i];

                if ($row[0] >= 100) {
                    $lvl = 'critical';

                } elseif ($row[0] >= 15) {
                    $lvl = 'warning';

                } else {
                    $lvl = 'info';
                }

                FireLogger::$default->log($lvl, $row[1]);
                FireLogger::$default->log($lvl, "-- Time:$row[0]   Rows:$row[2]   Connection:$row[3]");
            }
        }
    }
}

Editoval Milo (13. 12. 2011 20:45)