jueves, 8 de abril de 2010

Crear archivo log de transacciones y errores PHP - PostgreSql

Crea automáticamente archivos de texto para cada transacción o consulta a la Base de Datos, así como de los errores que ocurran. Los archivos creados son por día. Este ejemplo utiliza PostgreSql, pero con pequeños cambios lo podrás adaptar a MySql o SQLserver.

El archivo resultante viene en un formato humanamente legible.

Útil para:
a) Depurar el código de tu aplicación
b) Hacer que el sistema sea auditable




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Log de transacciones y errores con PHP y PostgreSql</title>
</head>

<body>
<?php 
include("lib_database.php"); // no olvides incluir la ruta en caso de ser necesario
$xsql = "Select * FROM tabla_prueba Limit 5";
$xres = LOGS($xconn, $xsql);
?>
</body>
</html>



<?php // Archivo lib_database.php
$xconn_host   = '127.0.0.1';
$xconn_port   = '5432';
$xconn_name   = 'prueba_db';
$xconn_user   = 'www_prueba';
$xconn_pwd    = 'pwdprueba';

// Aquí debes especificar la ruta en donde se van a grabar los archivos de texto.
// En esta ejemplo, puedo escoger dos ubicaciones diferentes: la del servidor de pruebas
// y la del servidor de producción. 
$xcarpetaLogs = '/usr/local/apache2/htdocs/php/libs/logs/';
$xcarpetaErrs = '/usr/local/apache2/htdocs/php/libs/errors/';
if ($_SERVER['HTTP_HOST'] != '127.0.0.1')
   {
   $xcarpetaLogs = '/var/www/code/libs/logs/';
   $xcarpetaErrs = '/var/www/code/libs/errors/';
   }

$xconnect = "host=".$xconn_host." port=".$xconn_port." dbname=".$xconn_name." user=".$xconn_user." password=".$xconn_pwd." ";
$xconn= pg_connect($xconnect);
pg_query($xconn, "SET CLIENT_ENCODING TO 'UTF8'"); // aquí se puede elegir SQL_ASCII, LATIN1..LATIN15, etc.

function LOGS($xconn, $xtransaccion)
   {
   //Ejecutar transaccion
   $xtransaccion_old = $xtransaccion;
   $xresult_sql = pg_query($xconn, $xtransaccion);
   $xlast_error = pg_last_error($xconn);
   $xfecha = date("Y-m-d");
   $xhora = date("H:i:s");
   
   // Generación de la ficha
   $xcadenota = "\nFECHA:\t\t".date("Y-m-d").", ".date("H:i:s");
   $xcadenota.= "\nUSUARIO:\t".$_SESSION['id_usuario']." - ".$_SESSION['nombre_usuario']; // Aqui colocar tus propias variables de sesi?n
   $xcadenota.= "\nHOST:\t\t".$_SERVER['HTTP_HOST'];
   $xcadenota.= "\nCLIENTE:\t".$_SERVER['REMOTE_ADDR'];
   $xcadenota.= "\nSITIO:\t\t".$_SESSION['id_sitio']." - ".$_SESSION['nombre_unidad']; // Aqui colocar tus propias variables de sesión
   $xcadenota.= "\nPERFIL:\t\t".$_SESSION['id_perfil']." - ".$_SESSION['perfil']; // Aqui colocar tus propias variables de sesión
   $xcadenota.= "\nLLAMADA:\t".$_SERVER['HTTP_REFERER']; // Coloca el nombre del programa que hizo la llamada al programa que se ejecutó
   $xcadenota.= "\nPROGRAMA:\t".$_SERVER['REQUEST_URI']; // Coloca el nombre del programa que se ejecutó más sus variables trasferidas por la URL
   if ($xlast_error)
      $xcadenota.= "\n\t\t".$xlast_error; // En caso de haber error, coloca el mensaje de error del manejador de la BD
   $xcadenota.= "\nQUERY:\t\t".$xtransaccion_old."\n\n"; // Coloca la transacci?n o la consulta tal cual sucedi? en la BD
   
   // Aquí decidir la carpeta donde se tengan permisos de escritura para el usuario www-data
   // automáticamente se creará un archivo por día, y en caso de existir, adiciona al final cada bloque de mensajes
   $arch = fopen($xcarpetaLogs."logs_".date("Y-m-d").".txt", "a+"); 
   
   fwrite($arch, $xcadenota);
   fclose($arch);
   //
   if ($xlast_error)
      {
      $arch_error = fopen($xcarpetaErrs."errors_".date("Y-m-d").".txt", "a+");
      fwrite($arch_error, $xcadenota);
      fclose($arch_error);
      
      // Despliega el error en la ventana del navegador
      echo "<br><font face='Verdana, Arial, Helvetica, sans-serif' size='2' color='#FF0000'><b>".$xlast_error."</b></font><br>"; 
      echo "<font face='Verdana, Arial, Helvetica, sans-serif' size='2' color='#FF0000'>".$xtransaccion_old."</font><br>"; 
      } // ENDIF
   return $xresult_sql;
   } // END FUNCTION
?>

2 comentarios:

  1. Donde consigo o cual es la ruta de lib_database.php en mi caso utilizo xampp 1.7.4

    ResponderEliminar
  2. El archivo lib_database.php es la función que debes escribir (copiar y pegar) y entonces debes cargarla con include en todos tus programas que hacen una conexión con la base de datos.

    <?php // Archivo lib_database.php
    $xconn_host = '127.0.0.1';
    $xconn_port = '5432';
    $xconn_name = 'prueba_db';
    $xconn_user = 'www_prueba';
    $xconn_pwd = 'pwdprueba';
    ...

    ResponderEliminar

Datos personales

Mi foto
Podrás encontrar códigos recursos y artículos sobre PHP, JavaScript, jQuery, MooTools, Ajax, CSS, HTML, UML, RUP, AUP, XP (eXtreme Programming), Six-Sigma, CMMI, FrameWorks, Zend Framework, Magento, CodeIgniter, CakePHP, Joomla 1.5, Doctrine, Active Record, ORM, POO, MVC, MySql, PostgreSql. Este espacio está destinado a ayudar y compartir un poco de lo mucho que he recibido de la comunidad en la Red.