Cómo usar el Logger en Magento2

Logs

En Magento 1 usábamos, y abusábamos, de Mage:log() para registrar en logs algún mensaje o depuración de nuestros módulos.

En Magento 2, al ya no tener a la omnipresente Mage, las cosas se hacen un poquito diferente.

Para no perder la costumbre, voy a seguir modificando el módulo Barbanet_SampleModule.

Ya que el ejemplo es algo sencillo, voy a crear un nuevo comando de consola (ya habíamos visto antes cómo se hace), para mostrar cómo hacer uso del logger.

Primero sumo mi definición en etc/di.xml, debajo del comando anterior. Entonces, agrego la línea:

<item name="sampleModuleLogger" xsi:type="object">Barbanet\SampleModule\Console\Logger</item>

Dejando el archivo di.xml de la siguiente forma:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Footer" type="Barbanet\SampleModule\Block\Html\Footer" />
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="sampleModuleHello" xsi:type="object">Barbanet\SampleModule\Console\Hello</item>
                <item name="sampleModuleLogger" xsi:type="object">Barbanet\SampleModule\Console\Logger</item>
            </argument>
        </arguments>
    </type>
</config>

Y ahora, creo el archivo /Console/Logger.php, con el siguiente contenido:

<?php

namespace Barbanet\SampleModule\Console;
 
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
 
/**
 * Class Logger
 * @package Barbanet\SampleModule\Console
 */
class Logger extends Command
{
 
    /**
     * @var
     */
    private $logger;
 
    /**
     * @param \Psr\Log\LoggerInterface $logger
     * @param null $name
     */
    public function __construct(
        \Psr\Log\LoggerInterface $logger,
        $name = null
    ) {
        $this->logger = $logger;
        parent::__construct($name);
    }
 
    protected function configure()
    {
        $this->setName('samplemodule:logger');
        $this->setDescription('Barbanet_SampleModule Logger test command');
    }
 
    /**
     * @param InputInterface $input
     * @param OutputInterface $output
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->logger->alert('Mensaje Alerta');
        $this->logger->critical('Mensaje Crítico');
        $this->logger->debug('Mensaje Debug');
        $this->logger->emergency('Mensaje Emergencia');
        $this->logger->error('Mensaje Error');
        $this->logger->info('Mensaje Info');
        $this->logger->notice('Mensaje Notice');
        $this->logger->warning('Mensaje Warning');
        $this->logger->log(\Psr\Log\LogLevel::INFO, 'Mensaje Log');
    }
}

Lo que se hace para acceder al logger es inyectarlo en nuestro método o, como en nuestro ejemplo, en el constructor.

De esta forma lo tendremos, claro está, disponible en nuestra clase. Luego, para usarlo, tenemos los métodos:

  • alert
  • critical
  • debug
  • emergency
  • error
  • info
  • notice
  • warning

Luego, podemos hacer uso del método log, que a diferencia de los anteriores, necesita que se le especifique, como primer parámetro, el nivel (que pueden encontrar en \Psr\Log\LogLevel).

Para terminar con la prueba ejecuto el comando en la consola.

bin/magento samplemodule:logger

Y ahora revisamos el directorio var/log de nuestra instancia Magento. Allí veremos que se han creado dos archivos: debug.log y system.log.

En debug.log encontramos:

[2017-06-27 02:01:19] main.DEBUG: Mensaje Debug {"is_exception":false} []

Y en system.log:

[2017-06-27 02:01:19] main.ALERT: Mensaje Alerta [] []
[2017-06-27 02:01:19] main.CRITICAL: Mensaje Crítico [] []
[2017-06-27 02:01:19] main.EMERGENCY: Mensaje Emergencia [] []
[2017-06-27 02:01:19] main.ERROR: Mensaje Error [] []
[2017-06-27 02:01:19] main.INFO: Mensaje Info [] []
[2017-06-27 02:01:19] main.NOTICE: Mensaje Notice [] []
[2017-06-27 02:01:19] main.WARNING: Mensaje Warning [] []
[2017-06-27 02:01:19] main.INFO: Mensaje Log [] []

Los mensajes del método debug se almacenan en un log independiente, mientras que el resto usa system.log.

Todo lo comentado sobre el módulo Barbanet_SampleModule está disponible en GitHub bajo el tag 2.17.0.