Como criar um log personalizado no Magento 2
Tags: php, magento2, tutorial, braziliandevs
Published: 2021-12-17 14:42:52

## 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](https://pt.wikipedia.org/wiki/Log_de_dados)

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](https://www.php-fig.org/psr/psr-3/).

---

## 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
<?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);
    }
}
```

### 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
<?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';
}
```

#### 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
<?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>
```

---

## Finalização

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

</aside>

### 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.

```bash
rm -rf var/generation/
rm -rf generated/
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento flush
```

### 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
```