Monolog: trabaja con archivos de log en php



En un archivo de log o en una base de datos puedes guardar información sobre el uso de tu aplicación, por ejemplo puedes guardar quien fue el que modifico el limite de crédito de un cliente, quien ingresa al sistema y desde que dirección ip lo hace, los errores que se producen, etc.

Toda esta información puede llegar a serte muy útil al realizar una auditoria, detectar posibles ataques a tu aplicación, encontrar errores que nadie reportar, etc.

En este articulo voy a mostrarte una forma sencilla de agregar registros de log a tu sistema desarrollado en PHP, para esto vamos a utilizar composer y monolog. Si aún no tienes instalado composer o no estás seguro de que es, puedes leer un articulo sobre ello haciendo clic aquí.

Ahora para instalar monolog ejecuta este comando:

composer require monolog/monolog

Ahora vamos veamos un pequeño ejemplo de como utilizarlo, después de correr el comando anterior crea un archivo con este contenido en esa misma carpeta.

<?php
  //Cargar paquetes instalados con composer
  require __DIR__ . '/vendor/autoload.php';
  //Crear un archivo de log (app.log)
  $logHandler = new Monolog\Handler\StreamHandler(__DIR__ .'/app.log');
  // Inicializa el control de logs
  $logger = new Monolog\Logger('mi-aplicacion');
  //Definir el modo de manejar el log (con el archivo definido antes)
  $logger->pushHandler($logHandler);
  //Grabar entras de log, repertir esta linea cada vez que
  //necesitamos agregar una entrada al log
  $logger->debug('Es una prueba de entradas en logs');
?>;

Ahora si ejecutas el archivo con el código anterior, veras que se ha creado un nuevo archivo llamado app.log, y dentro de él, está la entrada que pusimos.

Entonces para trabajar con archivos de log en tu aplicación debes configurar el log al inicio de tu aplicación con las primeras líneas del código que te mostré y la ultima línea la repites cada vez que desees agregar una entrada al log.

Trabajar con archivos de log en php

Niveles de logs

Lo anterior fue un ejemplo bastante básico, solo para comenzar, cuando trabajas con logs existen algunos niveles de importancia que se usan para filtrar los mensajes o entradas, por ejemplo si quieres hacer una revisión semanal de los errores del sistema, puedes filtrar únicamente los mensajes de nivel ERROR. Los niveles que esta disponibles en monolog son:

  • DEBUG (100): Información que colocamos para detectar errores, por ejemplo si algún proceso esta generando error podríamos guardar aquí los parámetros con los que se ejecuta dicho proceso y su resultado, para luego intentar reproducir los casos en que se genera un error.
  • INFO (200): Eventos que son de algún interés particular, como por ejemplo entradas al sistema, sentencias sql ejecutadas, algunas búsquedas realizadas, reportes que se han ejecutado, etc.
  • NOTICE (250): Son eventos normales, pero que podrían indicar algún posible fallo, por ejemplo intentos de acceso denegados a alguna parte del sistema, podrían indicar un intento de robo de información.
  • WARNING (300): Son eventos que no han generado un error, pero podrían llegar a provocar problemas, por ejemplo si se está usando una clase obsoleta, una versión de nuestra api o webervice que este obsoleta, si un usuario está llegando a su límite de espacio de almacenamiento, etc.
  • ERROR (400): Errores aislados en el sistema, aun que se generó este error, el sistema sigue operativo y el resto de las personas pueden seguir trabajando. Por ejemplo si un reporte no puede generarse.
  • CRITICAL (500): Son errores más graves, por ejemplo un modulo completo esta fallando, no se pueden emitir facturas, no se pueden registrar usuarios, etc.
  • ALERT (550): Errores muy importantes por ejemplo la base de datos se ha caido, la red no funciona, etc.
  • EMERGENCY (600): Al llegar a este nivel, el sistema esta totalmente fuera de uso, nadie puede utilizar ninguna de sus funcionalidades.

Para usar cada uno de estos niveles en nuestros logs, solo debemos cambiar la línea de codigo con la que ingresamos entradas al log.

$logger->debug('Es una prueba de entradas en logs');

En lugar de la palabra debug, vamos a usar el nivel que necesitemos por ejemplo:

$logger->info('el usuario ha ingresado al sistema');

Agregar información extra

También es posible agregar información extra como el contenido de alguna variable, la ip, el usuario que ejecuto el proceso, etc. Para esto al momento de insertar la línea al log, le enviamos un segundo parámetro en forma de arreglo (array), por ejemplo:

$logger->debug('Llamado a funcion x', array('producto' => '00001'));

En ocasiones nos reportan que una función está fallando, pero cuando probamos esta todo bien, y el problema es que falla únicamente en algún caso en particular, pero con este log ahora puedes probar justo el caso que falla, usando los parámetros que grabaste en el log.

Uso de canales

Al inicio de este articulo, vimos un ejemplo básico de como configurar tu aplicación para trabajar con archivos de log, y una de las líneas que necesitamos es esta:

// Inicializa el control de logs
$logger = new Monolog\Logger('mi-aplicacion');

Bien, la parte que dice ‘mi-aplicacion’, es el canal, esto es muy útil en sistemas grandes, compuestos de varios módulos, por ejemplo contabilidad, inventario, clientes, ventas, etc. De esta forma puedes tener un canal para cada módulo, y tener todo en un mismo archivo. Si aún te preguntas que utilidad puede tener esto de los canales y por que no simplemente tener un archivo separado para cada módulo en lugar de usar canales, aquí hay un ejemplo:

Al administrador de bases de datos, le importan todos los errores relacionados con la base de datos y buscar o monitorear varios archivos de logs, no es práctico, lo mismo sucede para los auditores.

Pero al encargado del módulo de ventas, solo le interesan los mensajes del módulo de ventas, en este caso solo filtra el archivo por el canal “ventas” y de esa forma todos obtienen lo que desean sin afectar al resto.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *