Crear un Log personalizado en Magento 2

Crear un Log personalizado en Magento 2

Cuando desarrollamos un nuevo módulo en nuestra tienda, siempre es útil tener un log personalizado para poder detectar distintos procesos de manera informativa, o posibles errores en nuestro módulo.

Primero crearemos una clase Logger que usaremos simplemente para que la use el Handler que crearemos más adelante.

app/code/JLNarvaez/CustomLog/Logger/Logger.php
<?php
namespace JLNarvaez\CustomLog\Logger;

class Logger extends \Monolog\Logger
{
}

Ahora creamos el Handler donde indicaremos dos variables.

La primera será $loggerType en el que indicaremos a través de una constante, el tipo de logs que aparecerán en este fichero, aunque posteriormente podremos hacer log de cualquier tipo de contenido (error, info, warning…).

La segunda variable será $fileName en el que indicaremos el nombre del fichero de nuestro nuevo log. Normalmente los logs van en la ruta /var/log, por lo que indicaremos esta ruta seguido de nuestro nombre de fichero. En este caso el nombre del fichero será jlnarvaez_custom.log.

app/code/JLNarvaez/CustomLog/Logger/Handler.php
<?php
namespace JLNarvaez\CustomLog\Logger;

use Monolog\Logger;

class Handler extends \Magento\Framework\Logger\Handler\Base
{
    /**
     * Logging level
     * @var int
     */
    protected $loggerType = Logger::INFO;

    /**
     * File name
     * @var string
     */
    protected $fileName = '/var/log/jlnarvaez_custom.log';
}

Por último, definiremos en el fichero di.xml nuestro nuevo Log. Por una parte registraremos nuestro Handler, y por otro lado nuestro Logger. Lo haremos de la siguiente manera:

 app/code/JLNarvaez/CustomLog/etc/di.xml
 <?xml version="1.0"?>
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
     <!-- ... -->
     <!-- ... -->
     <!-- ... -->
     
     <type name="JLNarvaez\CustomLog\Logger\Handler">
         <arguments>
             <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
         </arguments>
     </type>
     <type name="JLNarvaez\CustomLog\Logger\Logger">
         <arguments>
            <!-- Nombre que tendrá el Logger (aparecerá en el fichero .log cuando se escriba algun log) -->
             <argument name="name" xsi:type="string">myCustomLog</argument> 
             <argument name="handlers"  xsi:type="array">
                <!-- Namespace de nuestro Handler -->
                 <item name="system" xsi:type="object">JLNarvaez\CustomLog\Logger\Handler</item> 
             </argument>
         </arguments>
     </type>
     
     <!-- ... -->
     <!-- ... -->
     <!-- ... -->
 </config>

Una vez hecho todo esto, ya podremos inyectar nuestro nuevo Logger en el constructor de cualquier clase, y poder utilizarlo. Un ejemplo podría ser el siguiente (Usando el controlador creado en este tutorial):

<?php
namespace JLNarvaez\CustomLayout\Controller\Saludo;

use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Action\Action;
// Añadimos nuestro Logger
use JLNarvaez\CustomLog\Logger\Logger as CustomLogger;

class Index extends Action
{
    /** @var PageFactory  */
    private $pageFactory;
    /** @var CustomLogger */
    private $customLogger;

    /**
     * Index constructor.
     *
     * @param Context $context
     * @param PageFactory $pageFactory
     * @param CustomLogger $customLogger
     */
    public function __construct(
        Context $context,
        PageFactory $pageFactory,
        CustomLogger $customLogger
    ) {
        $this->pageFactory = $pageFactory;
        $this->customLogger = $customLogger;
        
        return parent::__construct($context);
    }

    /** @inheritdoc */
    public function execute()
    {
        $this->logger->info('Empieza nuestro controlador...');
        
        $paramId = $this->getRequest()->getParams('id');
        
        if (!$paramId) {
            $this->logger->error('Parámetro ID no definido');
        }
        
        $this->logger->info('Termina nuestro controlador...');
        
        return $this->pageFactory->create();
        
    }
}

Con esto, al ejecutar el controlador veremos algo así en nuestro fichero /var/log/jlnarvaez_custom.log:

[2021-30-05 10:35:18] myCustomLog.INFO: Empieza nuestro controlador... [] []
[2021-30-05 10:35:18] myCustomLog.ERROR: Parámetro ID no definido [] []
[2021-30-05 10:35:18] myCustomLog.INFO: Termina nuestro controlador... [] []

Dejo por aquí un gist de Github con el código del tutorial.

Jose Luis
Jose Luis
Magento 2 Certified Developer