Crear logs de inserts, updates y deletes dentro de CakePHP

565 views
Skip to first unread message

Alejandro Reyes

unread,
Dec 5, 2013, 11:23:14 AM12/5/13
to cakep...@googlegroups.com
Saludos a todos:

Recientemente necesitaba un registro de todos los insert, updates y deletes que se realizan en un sistema hecho con CakePHP. Despues de investigar encontre esta solución, que escribe en un archivo las sentencias de sql dentro de un archivo. La versión de Cakephp es versión 2.4.1.

1.- crear un archivo en : /var/www/SCSG_2013/lib/Cake/Model/Datasource/Database/MysqlExt.php, con el siguiente contenido:


<?php


//App::uses('Mysql', 'Model/Datasource');

App::uses('Mysql', 'Model/Datasource/Database');

class MysqlExt extends Mysql {

    public function renderStatement($type, $data) {
        extract($data);
        $aliases = null;

        switch (strtolower($type)) {
            case 'select':
                return "SELECT {$fields} FROM {$table} {$alias} {$joins} {$conditions} {$group} {$order} {$limit}";
            case 'create':
                /*
                * Para guardar una bitacora de los usuarios
                */
                $fileLog = TMP. 'logs/query.log';
                $data = 'ID: ' . $_SESSION['Auth']['User']['id'] . '|' . 'USERNAME: ' . $_SESSION['Auth']['User']['username'] . '|SQL: ' . "INSERT INTO {$table} ({$fields}) VALUES ({$values})" . PHP_EOL;
                $fp = fopen($fileLog, 'a');
                fwrite($fp, $data);
                fclose($fileLog);           
                return "INSERT INTO {$table} ({$fields}) VALUES ({$values})";
            case 'update':
                if (!empty($alias)) {
                    $aliases = "{$this->alias}{$alias} {$joins} ";
                }
                /*
                * Para guardar una bitacora de los usuarios
                */
                $fileLog = TMP. 'logs/query.log';
                $data = 'ID: ' . $_SESSION['Auth']['User']['id'] . '|' . 'USERNAME: ' . $_SESSION['Auth']['User']['username'] . '|SQL: ' . "UPDATE {$table} {$aliases}SET {$fields} {$conditions}" . PHP_EOL;
                $fp = fopen($fileLog, 'a');
                fwrite($fp, $data);
                fclose($fileLog);
                return "UPDATE {$table} {$aliases}SET {$fields} {$conditions}";
            case 'delete':
                if (!empty($alias)) {
                    $aliases = "{$this->alias}{$alias} {$joins} ";
                }
                /*
                * Para guardar una bitacora de los usuarios
                */
                $fileLog = TMP. 'logs/query.log';
                $data = 'ID: ' . $_SESSION['Auth']['User']['id'] . '|' . 'USERNAME: ' . $_SESSION['Auth']['User']['username'] . '|SQL: ' . "DELETE {$alias} FROM {$table} {$aliases}{$conditions}" . PHP_EOL;
                $fp = fopen($fileLog, 'a');
                fwrite($fp, $data);
                fclose($fileLog);               
                return "DELETE {$alias} FROM {$table} {$aliases}{$conditions}";
            case 'schema':
                foreach (array('columns', 'indexes', 'tableParameters') as $var) {
                    if (is_array(${$var})) {
                        ${$var} = "\t" . implode(",\n\t", array_filter(${$var}));
                    } else {
                        ${$var} = '';
                    }
                }
                if (trim($indexes) !== '') {
                    $columns .= ',';
                }
                return "CREATE TABLE {$table} (\n{$columns}{$indexes}) {$tableParameters};";
            case 'alter':
                return;
        }
    }

}


2.- En la configuracion del archivo de la base de datos(database.php), cambiar:

'datasource' => 'Database/Mysql',

por

'datasource' => 'Database/MysqlExt',


3.- crear el archivo que definieron en $fileLog = TMP. 'logs/query.log'; y darle los permisos adecuados, en mi caso los logs se ven asi:

ID: 1|USERNAME: admin|SQL: DELETE `EventosAsistente` FROM eventos_asistentes` AS `EventosAsistente`   WHERE `EventosAsistente`.`asistente_id` = 24 AND `EventosAsistente`.`evento_id` IS NULL
ID: 1|USERNAME: admin|SQL: DELETE `EventosAsistente` FROM eventos_asistentes` AS `EventosAsistente`   WHERE `EventosAsistente`.`id` = 313
ID: 1|USERNAME: admin|SQL: DELETE `Asistente` FROM `asistentes` AS `Asistente`   WHERE `Asistente`.`id` = 24




$pyd3r

unread,
Dec 6, 2013, 2:12:06 PM12/6/13
to cakep...@googlegroups.com
Esto es una mala practica los archivos del core no deben ser tocados ya que limitas realizar un update de la aplicación. 
Simplemente en el app Model de tu aplicación pones en los callback de delete, save and update para guardar en los log 

Carlos Solorzano

unread,
Dec 6, 2013, 2:13:13 PM12/6/13
to cakep...@googlegroups.com
Recomendaría hacerlo con trigger (disparadores)


--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a cakephp-esp...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/cakephp-esp.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Carlos Luis Solórzano Solórzano

$pyd3r

unread,
Dec 16, 2013, 2:00:14 PM12/16/13
to cakep...@googlegroups.com
Si lo hace con trigger complicaras el mantenimiento de la base de datos en caso que necesites migrar  otra plataforma. 


El jueves, 5 de diciembre de 2013 11:23:14 UTC-5, Alejandro Reyes escribió:

c.pf...@gmail.com

unread,
Dec 26, 2013, 9:38:49 AM12/26/13
to cakep...@googlegroups.com
Creo que lo mejor que podes hacer es usar: https://github.com/robwilkerson/CakePHP-Audit-Log-Plugin
saludos

=========================================================
Ing. Christian N. Pfarher
S3000 Santa Fe. Argentina
e-mail: c.pf...@gmail.com
blog: 
http://kikipblog.blogspot.com
twitter: @cpfarerr
skype: kikip1
=========================================================


2013/12/5 Alejandro Reyes <pryo...@gmail.com>
Reply all
Reply to author
Forward
0 new messages