Registro con Monolog en PHP 7

La comunidad PHP proporciona varias bibliotecas de registro para que elijamos, como Monolog, Analog, KLogger, Log4PHP y otras. Elegir la biblioteca correcta puede ser una tarea desalentadora.
Más aún porque podríamos decidir cambiar el mecanismo de registro más adelante, lo que podría dejarnos una cantidad sustancial de código para cambiar. Aquí es donde ayuda el estándar de registro PSR-3. Elegir una biblioteca que cumpla con los estándares hace que sea más fácil razonar.

Monolog es una de las bibliotecas de registro de PHP más populares. Es una biblioteca gratuita con licencia MIT que implementa el estándar de registro PSR-3. Nos permite enviar fácilmente nuestros registros a archivos, sockets, bandejas de entrada, bases de datos y diversos servicios web.
Podemos instalar fácilmente la biblioteca Monolog como un paquete composer ejecutando lo siguiente comando de consola dentro de nuestra carpeta de proyectos:

composer require monolog/monolog

Si el compositor no es una opción, podemos descargar Monolog desde GitHub en https://github.com/Seldaek/monolog.
El cumplimiento del estándar de registro de PSR-3 también significa que Monolog admite los niveles de registro descritos por RFC 5424, de la siguiente manera:

  • DEBUG (100): mensajes de nivel de depuración
  • INFO (200): mensajes informativos
  • NOTICE (250): condición normal pero significativa
  • WARNING (300): condiciones de advertencia
  • ERROR (400): condiciones de error
  • CRITICAL (500): condiciones críticas
  • ALERT (550): se deben tomar medidas de inmediato
  • EMERGENCY (600): el sistema no se puede usar

Estas constantes se definen como parte del archivo vendor/monolog/monolog/src/Monolog/Logger.php, junto con un ejemplo práctico de caso de uso para la mayoría de ellos.
El concepto central detrás de cada instancia de registro de Monolog es que la instancia en sí tiene un canal (nombre) y una pila de controladores. Podemos crear instancias de múltiples registradores, cada uno de los cuales define un determinado canal (db, solicitud, enrutador y similares). Cada canal puede combinar varios manejadores.
Los manejadores mismos se pueden compartir entre canales. El canal se refleja en los registros y nos permite ver o filtrar registros fácilmente. Finalmente, cada controlador también tiene un formateador. El formateador normaliza y formatea los registros entrantes para que puedan usarse por los manejadores para generar información útil.

El siguiente diagrama visualiza esta estructura de formateador de canales del registrador:

Diagrama

Monolog proporciona una lista bastante extensa de registradores y formateadores.

  • Registradores:
    -Registro en archivos y syslog (StreamHandler, RotatingFileHandler, SyslogHandler, …)
    -Enviar alertas y correos electrónicos (SwiftMailerHandler, SlackbotHandler, SendGridHandler, …)
    -Servidores específicos de registro y registro en red (SocketHandler, CubeHandler, NewRelicHandler, …)
    -Registro en desarrollo (FirePHPHandler, ChromePHPHandler, BrowserConsoleHandler, …)
    -Registro en bases de datos (RedisHandler, MongoDBHandler, ElasticSearchHandler, …)
  • Formateadores:
    -LineFormatter
    -HTMLFormatter
    -JsonFormatter
    -…

Puede obtener una lista completa de registradores y formateadores Monolog a través de la página oficial del proyecto Monolog en https://github.com/Seldaek/monolog.

Echemos un vistazo al siguiente ejemplo simple:

<?php
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Handler\BrowserConsoleHandler;
$logger = new Logger('foggyline');
$logger->pushHandler(new RotatingFileHandler(DIR .
'/foggyline.log'), 7);
$logger->pushHandler(new BrowserConsoleHandler());
$context = [
'user' => 'john',
'salary' => 4500.00
];
$logger->addDebug('Logging debug', $context);
$logger->addInfo('Logging info', $context);
$logger->addNotice('Logging notice', $context);
$logger->addWarning('Logging warning', $context);
$logger->addError('Logging error', $context);
$logger->addCritical('Logging critical', $context);
$logger->addAlert('Logging alert', $context);
$logger->addEmergency('Logging emergency', $context);

Aquí, estamos creando una instancia de Logger y nombrándolo foggyline. Luego usamos el método pushHandler para enviar instancias instanciadas en línea de dos controladores diferentes.
RotatingFileHandler registra registros en un archivo y crea un archivo de registro por día. También elimina archivos anteriores al argumento $maxFiles, que, en nuestro ejemplo, se establece en 7.
Independientemente del nombre del archivo de registro establecido en foggyline.log, el archivo de registro real creado por RotatingFileHandler contiene la marca de tiempo, lo que da como resultado un nombre como foggyline-2016-12-26.log. Cuando lo pensamos, el papel de este controlador es notable. Además de crear nuevas entradas de registro, también se encarga de eliminar los registros antiguos.
La siguiente es una salida de nuestro archivo foggyline-2016-12-26.log:

[2016-12-26 12:36:46] foggyline.DEBUG: Logging debug
{"user":"john","salary":4500} []
[2016-12-26 12:36:46] foggyline.INFO: Logging info
{"user":"john","salary":4500} []
[2016-12-26 12:36:46] foggyline.NOTICE: Logging notice
{"user":"john","salary":4500} []
[2016-12-26 12:36:46] foggyline.WARNING: Logging warning
{"user":"john","salary":4500} []
[2016-12-26 12:36:46] foggyline.ERROR: Logging error
{"user":"john","salary":4500} []
[2016-12-26 12:36:46] foggyline.CRITICAL: Logging critical
{"user":"john","salary":4500} []
[2016-12-26 12:36:46] foggyline.ALERT: Logging alert
{"user":"john","salary":4500} []
[2016-12-26 12:36:46] foggyline.EMERGENCY: Logging emergency
{"user":"john","salary":4500} []

El segundo controlador que empujamos para apilar, BrowserConsoleHandler, envía registros a la consola JavaScript del navegador sin necesidad de extensión del navegador. Esto funciona en la mayoría de los navegadores modernos que admiten la API de la consola. El resultado de este controlador se muestra en la siguiente captura de pantalla

Captura de pantalla

Con estas pocas líneas de código simples, hemos agregado un conjunto bastante impresionante de capacidades de registro a nuestra aplicación. RotatingFileHandler parece perfecto para un análisis de estado posterior de una aplicación en ejecución de producción, mientras que BrowserConsoleHandler podría servir como una forma conveniente de acelerar el desarrollo continuo. Dice que los registros tienen un propósito más amplio de solo registrar errores. Al registrar varias piezas de información en varios niveles de registro, podemos usar fácilmente la biblioteca Monolog como una especie de puente analítico. Todo lo que se necesita es que se empuje los controladores adecuados a la pila, que a su vez empuja los registros a varios destinos, como Elasticsearch y similares.

Comparte