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