Como criar um log personalizado no Magento 2

Lucas Teixeira dos Santos Santana - Dec 17 '21 - - Dev Community

Contextualizando

O que é um log?

Log de dados é uma expressão utilizada para descrever o processo de registro de eventos relevantes num sistema computacional. Esse registro pode ser utilizado para restabelecer o estado original de um sistema ou para que um administrador conheça o seu comportamento no passado. Um arquivo de log pode ser utilizado para auditoria e diagnóstico de problemas em sistemas computacionais
Wikipedia

Existem inúmeras formas da criação de logs, a convenção adotada pela comunidade do PHP se tornou uma PSR e o Magento 2 a utiliza por padrão, implementando a interface \Psr\Log\LoggerInterface. Saiba mais a página oficial sobre na PSR-3 - Logger Interface.


Código para criar um Log

Para criar um log personalizado no Magento 2 é necessário estender a classe por padrão \Monolog\Logger que implementa a \Psr\Log\LoggerInterface. Este tipo de arquivo deve seguir a estruturas de pastas \{Vendor}\{Module}\Logger\{Loggername}.php.

Caso seja necessário criar algum novo tipo de log é neste arquivo que será implementado o método e/ou o nome, tipo e valor do log.

<?php

namespace {Vendor}\{Module}\Logger;

use Monolog\Logger;

class {Loggername} extends Logger
{
    public const {CUSTOM_LOG_NAME} = {VALUE};

    protected static array $levels = [
        self::DEBUG => 'DEBUG',
        self::INFO => 'INFO',
        self::NOTICE => 'NOTICE',
        self::WARNING => 'WARNING',
        self::ERROR => 'ERROR',
        self::CRITICAL => 'CRITICAL',
        self::ALERT => 'ALERT',
        self::EMERGENCY => 'EMERGENCY',
        self::{CUSTOM_LOG_NAME} => '{CUSTOM_LOG_NAME}',
    ];

    public function {methodName}(string $message, array $context = []): bool
    {
        return $this->addRecord(static::{CUSTOM_LOG_NAME}, $message, $context);
    }
}
Enter fullscreen mode Exit fullscreen mode

Handler

A classe Handler define o tipo do log e o caminho do arquivo que será criado para a gravação das mensagens. O caminho do arquivo inicia a partir do diretório raiz do Magento. Este tipo de arquivo deve seguir a estruturas de pastas \{Vendor}\{Module}\Logger\{HandlerName}.php. Cada arquivo de Handler deve estender a classe \Magento\Framework\Logger\Handler\Base.

<?php

namespace {Vendor}\{Module}\Logger;

use {Vendor}\{Module}\Logger\{Loggername};
use Magento\Framework\Logger\Handler\Base;

class {HandlerName} extends Base
{
    protected int $loggerType = {Loggername}::{CUSTOM_LOG_NAME};

    protected string $fileName = '/var/log/{fileName}.log';
}
Enter fullscreen mode Exit fullscreen mode

Tipos de Logs

Constantes Severidade Descrição
DEBUG 100 Detalhes de informações do no processo de debug.
INFO 200 informação de eventos.
NOTICE 250 Eventos incomuns.
WARNING 300 Evento que ocorrem como excessões, mas não são erros (depreciações, avisos, etc).
ERROR 400 Erros em tempo de execução.
CRITICAL 500 Condições críticas.
ALERT 550 Alertas de ações que devem ser tomadas imediatamente.
EMERGENCY 600 Alertas urgentes.

di.xml

O arquivo di.xml será definido os tipos de argumentos que será inseridos nas classes criadas. Este tipo de arquivo deve seguir a estruturas de pastas \{Vendor}\{Module}\etc\{area}\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="{Vendor}\{Module}\Logger\{HandlerName}">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="{Vendor}\{Module}\Logger\{Loggername}">
        <arguments>
            <argument name="name" xsi:type="string">{logName}</argument>
            <argument name="handlers" xsi:type="array">
                <item name="system" xsi:type="object">{Vendor}\{Module}\Logger\{HandlerName}</item>
            </argument>
        </arguments>
    </type>
</config>
Enter fullscreen mode Exit fullscreen mode

Finalização

🔗 Valores entre chaves ({test}) devem ser alterados na implementação do código.

Habilitando as alterações

Apague os arquivos que são gerados na compilação do Magento e execute o comando PHP para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc) e para limpar todos os caches de armazenamento em cache do processos.

rm -rf var/generation/
rm -rf generated/
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento flush
Enter fullscreen mode Exit fullscreen mode

Diretórios e Arquivos

Segue a a lista de diretórios e arquivos que devem ser criados.

- app/
  - code/
    - {Vendor}/
      - {Module}/
        - etc/
          - {area}/
            - di.xml
          - module.xml
        - Logger/
          - {HandlerName}.php
          - {Loggername}.php
        - registration.php
        - composer.json
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .