Blog
Como trabajar con archivos de log y dos formas de crearlos en Magento 2
- febrero 9, 2024
- Publicado por: admin
- Categoría: Magento 2
En este artículo voy a intentar explicar que son los Log y como aplicarlos en Magento 2, así que voy por lo primero, un Log en programación aún más en concreto hablando de Magento es un archivo que podemos almacenar en algún lugar de nuestro proyecto, aun siendo más específico existe un lugar en donde podríamos encontrar ya algunos generados por Magento así como siendo esté el lugar más recomendable para colocarlos aquí “var/log”, e incluso los nuestros mismos que podemos ir creando, pero en sí su finalidad es que nos permite escribir algo en este archivo que nos indique que es lo que podría estar sucediendo en las líneas de código que tengamos en alguna clase.
Pensemos en una clase de Módulo Catalog.php que se ejecuta cuando un evento manda a llamar a esta CLASE, pero que por ningún lado podríamos ver si el resultado es correcto, o si alguna de las líneas de código que hemos colocado podrían estar fallando, ya que existen muchas clases en las que solo se pueden mandar a llamar sin esperar algo que suceda a simple vista, probablemente empecemos a depurar el código y busquemos entre los archivos de LOG ya existentes y nos sea más difícil encontrara si lo que estamos trabajando está correcto o no, pensemos en que tenemos una solución para una clase de un módulo propio y que necesitamos saber qué pasaría si se ejecuta tal acción, así que para lo cual podríamos echar mano de esta capacidad e ir almacenando que sucedería en cada ejecución de cada línea de código por ejemplo, la funcionalidad va a ir escribiendo lo que le indiquemos en cada llamado, así podríamos identificar de forma muy sencilla si lo que está pasando por detrás realmente está funcionando o en el mejor de los casos nos indicará que pudo haber fallado, claro el llamado a esta función simplemente es para escribir información en un archivo de texto, de nuestro lado debemos saber que podemos escribir o que necesitaríamos indicar para saber qué está sucediendo.
A continuación voy a mostrar las dos formas que utilizo yo para generar este tipo de archivos de Log, una es por medio de una inyección de CLASE llamada “Psr/Log” a través de una clase de Interfaz, y la segunda es directamente definiendo en código la clase de Zend “Log/Logger” en cualquiera de los dos casos voy a conseguir el propósito de escribir lo que pasa en mi código, claro esta que cada solución tiene su finalidad, la cual voy a explicar para entender que opción deberíamos utilizar y en qué casos.
LOG a través de la CLASE PSR/LOG
Esta opción la deberíamos utilizar cuando realmente necesitamos utilizar una forma de escribir los errores, advertencias, información o cualquier dato que nos dé una perspectiva más clara de lo que está sucediendo con algún componente o módulo que estemos trabajando, en pocas palabras esta opción no es temporal es para mantener un registro de la información que está sucediendo dentro de la funcionalidad aplicada.
Lo primero que necesitas es ubicar en que lugar la utilizaremos, bien podría ser en nuestra clase de Módulo, Controlador, alguna sección de Interfaz, en donde quiera que la utilicemos, vamos simplemente a inyectar la dependencia para que este a disposición, suponiendo que tenemos una clase “Test” veamos como sería agregarla:
<?php
namespace Marcgento\TestLog\Model;
class Test
{
/**
* @var \Psr\Log\LoggerInterface
*/
private $_logger;
public function __construct(
\Psr\Log\LoggerInterface $logger
){
$this->_logger = $logger;
}
public function collectSelect()
{
$this->_logger->alert('Mensaje ALERT');
$this->_logger->critical('Mensaje CRITICAL');
$this->_logger->emergency('Mensaje EMERGENCY');
$this->_logger->error('Mensaje ERROR');
$this->_logger->info('Mensaje INFO');
$this->_logger->notice('Mensaje NOTICE');
$this->_logger->warning('Mensaje WARNING');
}
}
El código anterior lo que ocasionaría sería registrar en el archivo var/log/system.log la siguiente información:
[2022-11-14 17:24:25] report.ALERT: Mensaje Alerta [] []
[2022-11-14 17:24:25] report.CRITICAL: Mensaje Critical [] []
[2022-11-14 17:24:25] report.EMERGENCY: Mensaje Emergencia [] []
[2022-11-14 17:24:25] report.ERROR: Mensaje Error [] []
[2022-11-14 17:24:25] report.INFO: Mensaje Info [] []
[2022-11-14 17:24:25] report.NOTICE: Mensaje Notice [] []
[2022-11-14 17:24:25] report.WARNING: Mensaje Warning [] []
De que va toda esta información, lo primero es recordar que no solo se podría registrar esta información en el archivo system.log, sino también podría suceder que se registre en un archivo llamado debug.log e incluso uno llamado support_report.log todo depende como esté configurado el proyecto, pero en concreto el que nos interesa es el system.log así que ahí es donde buscaríamos la información.
Como podemos ver en el código hay 7 funciones que podríamos utilizar al registrar información para un mensaje de Log los cuales son alert, critical, emergency, error, info, notice y warning, y para qué sirven cada una de esta funcionen, simplemente Magento quiere mantener un orden y ayudar al programador a identificar que función o método utilizar solo para identificar que podría estar sucediendo, ya que hay un indicador al inicio del mensaje que muestra que función se invocó por ejemplo lo podemos ver en la salida del LOG donde indica la salida report.ALERT dando como entendido que se invocó el método alert(), porque la información será almacenada en un mismo archivo está sería la forma de poder identificar que a pasado, vamos a suponer que tenemos la certeza de que solo queremos enviar un mensaje informativo simplemente podríamos usar el método info() o bien si en alguna condicione necesitamos, por un lado, enviar un mensaje de advertencia si se cumple la condición usaríamos el método warning() pero de lo contrario enviaríamos un mensaje de error para lo cual usaríamos el método error(), dentro del archivo principal system.log se estaría registrando todo, pero con el parámetro inicial del mensaje identificaríamos que ha pasado y que método fue invocado.
Ahora bien, voy a mostrar una nomenclatura para ver como se puede usar un método diferente al cual se le pasa por parámetro el indicativo y este estaría registrando la misma acción pero desde otro enfoque.
<?php
namespace Marcgento\TestLog\Model;
class Test
{
/**
* @var \Psr\Log\LoggerInterface
*/
private $_logger;
public function __construct(
\Psr\Log\LoggerInterface $logger
){
$this->_logger = $logger;
}
public function collectSelect()
{
$this->_logger->log(\Psr\Log\LogLevel::ALERT, 'Mensaje Log alert desde el metodo Log');
}
}
El método directo Log de la Clase PSR\Log funciona similar a los anteriores, solo que en este caso en la misma instrucción se indica cuál es la funcionalidad que se requiere registrar, para la cual sé usuaria cualquiera de los siguientes parámetros:
<?php
$this->_logger->log(\Psr\Log\LogLevel::ALERT, 'Mensaje Log alert desde el metodo Log');
$this->_logger->log(\Psr\Log\LogLevel::CRITICAL, 'Mensaje Log critical desde el metodo Log');
$this->_logger->log(\Psr\Log\LogLevel::EMERGENCY,'Mensaje Log emergency desde el metodo Log');
$this->_logger->log(\Psr\Log\LogLevel::ERROR, 'Mensaje Log error desde el metodo Log');
$this->_logger->log(\Psr\Log\LogLevel::INFO, 'Mensaje Log info desde el metodo Log');
$this->_logger->log(\Psr\Log\LogLevel::NOTICE, 'Mensaje Log notice desde el metodo Log');
$this->_logger->log(\Psr\Log\LogLevel::WARNING, 'Mensaje Log warning desde el metodo Log');
LOG a través de la CLASE ZEND “Log/Logger”
Ahora bien, voy a mostrar una funcionalidad que nosotros como desarrolladores solemos usar a menudo, ya que esta técnica es de forma temporal, no, nos interesa dejarla en código y simplemente necesitamos saber al momento que está sucediendo con el código, e incluso esta forma también podemos usarlo no simplemente en las clases de Back sino también en las propias vistas directamente en nuestros archivos .phtml puesto que como lo comente al inicio es la forma más rápida de saber como registrar un archivo de Log en nuestro proyecto.
Otra característica importante es que mediante esta opción podemos generar nuestro propio LOG con nombre personalizado, ya que esta forma de implementación tiene un método que nos permite indicar en donde lo almacenaríamos y que nombre llevaría registrado, a continuación voy a colocar la misma clase de Modelo con el código necesario solo recordar que este código se podrá implementar en cualquier clase e incluso cualquier vista del proyecto.
<?php
namespace Marcgento\TestLog\Model;
class Test
{
public function collectSelect()
{
$write = new \Zend\Log\Writer\Stream(BP . '/var/log/marcgento.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($write);
$logger->info('Mensaje INFO');
}
}
Una vez registrado este Log se generaría el archivo llamado marcgento.log mostrando la siguiente información.
2022-11-14T18:34:25+00:00 INFO (6): Mensaje INFO
Esta opción es muy sencillo de aplicar y no requiere un deploy en el proyecto, simplemente se colocan las instrucciones y de inmediato el registro al log empieza a escribir, en el mismo archivo.
Conclusiones
Dependiendo de que es lo que necesitamos desarrollar, tenemos que estar apegados a las buenas prácticas propuestas por Magento, ya sea que se implemente un método u el otro no debemos olvidar que todo puede a la larga generar recursos necesarios así que desde mi punto de vista el mantener un archivo de LOG, hay que tener en cuenta que también es necesario definir un programa de mantenimiento a futuro, ya que estos archivos pueden llegar a generar espacio en disco que será necesario ir depurando, pero si de lo contrario solo se está en proceso de desarrollo, bien podría sernos de mucha utiliza la segunda implementación temporal que nos permite aplicarla directamente en cualquier archivo.