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.