Cursos Magento

Gravando arquivo de log personalizado no Magento 2

,

16 de outubro de 2018

Este é o segundo e último artigo da série sobre Logs no Magento 2. No primeiro artigo, vimos como usar o sistema de log no Magento 2 e como ele funciona.

Neste artigo veremos como gerar arquivos personalizados e estender a classe de log do Magento 2. Caso esteja interessado em Magento 1, veja este outro artigo sobre como gravar logs no Magento 1.

Conhecendo os handlers de log nativos do Magento 2

Como vimos no artigo anterior, o Magento  faz uso da conhecida classe Monolog, e implementa 3 handlers nativos:

  • System – \Magento\Framework\Logger\Handler\System
  • Exception – \Magento\Framework\Logger\Handler\Exception
  • Debug – \Magento\Framework\Logger\Handler\Debug

Todos eles estendem a classe \Magento\Framework\Logger\Handler\Base, que então estende a classe \Monolog\Handler\StreamHandler – usada para gravar qualquer tipo de log em um formato do tipo stream (ex: arquivo local, arquivo remoto, php://stderr, etc).

Cada classe define um arquivo de saída e um nível de criticidade do log que ela representa, seguindo os padrões da RFC que vimos no artigo anterior.

O Base Handler

A classe Base é a responsável por criar o arquivo especificado em $fileName, e também por gravar as informações nele e tratar o nome do arquivo antes de criá-lo.

Veja só como ela é definida no di.xml do módulo base do Magento:

É lá que são definidos os handlers disponíveis – e eventualmente onde podemos adicionar um novo handler.

Veja que o \Magento\Framework\Logger\Handler\Exception não está listado. Ele é chamado pelo \Magento\Framework\Logger\Handler\System.

Adicionando um Handler de log no Magento 2

Você pode adicionar um Handler para fazer algo específico com as informações de log de um determinado tipo.  No exemplo abaixo, criaremos uma classe para salvar as informações de log do Magento 2 em um arquivo de log personalizado – no caso, magenteiro.log.

Para isso, nós precisamos:

  1. Criar uma classe Handler, que estende a classe Base ( \Magento\Framework\Logger\Handler\Base)
  2. Definir no __construct desta classe, qual $filesystem será usado pra gravar as informações recebidas. Este é o único parâmetro obrigatório no __construct da classe Base.
  3. Ainda na classe Handler, definir as propriedades protegidas $fileName e $loggerType com o nome do arquivo que queremos salvar e qual o tipo de criticidade que nosso handler vai tratar.
  4. Criar uma classe de log que estenda \Monolog\Logger para podermos usar depois
  5. Injetar o nome do nosso logger ( $name) e o handler ( $handlers) que criamos no construtor dela. Veja \Monolog\Logger::__construct.

Vamos lá?

Note que no passo 2 e no passo 5 usamos Dependency Injection para informar os parâmetros ao construtor das classes.

Sendo assim, ao importarmos nossa classe e chamarmos o método alert(), o conteúdo será gravado em /pastamagento/var/log/magenteiro.log.

Veja o exemplo:

Exemplo do resultado do log gravado no Magento 2

Exemplo do resultado gravado em var/log/magenteiro.log

Uma outra forma de gravar logs no Magento 2

Como vimos, acima temos a forma clássica e elegante de se fazer um log personalizado no Magento 2.

No entanto, existe uma forma ainda mais direta de fazê-lo (e menos elegante). Podemos ter resultados semelhantes usando a classe \Zend\Log\Logger.

Ficaria assim:

Desta forma, temos todos os métodos de debug (info, debug, warning, etc) sem muito código.

No entanto, podemos dizer que este é o jeito “feio” de fazer. Como sabemos, devemos injetar nossas dependências nas nossas classes e métodos.

Neste caso precisaríamos de 2 classes: \Zend\Log\Writer\Stream e \Zend\Log\Logger, sendo que na primeira delas informamos o caminho completo de onde queremos salvar nosso log.

O problema é que a primeira delas exige o caminho completo do arquivo que queremos salvar. Isso nos remete a ter que criar mais injeções de XML, eventualmente criar um virtualType, outras classes, etc. Sendo assim, é melhor ficar com o exemplo clássico, não é mesmo?

Módulo de exemplo (Magento 2 logs)

Digite seu nome e e-mail abaixo para obter o módulo com os exemplos exibidos nesta série.

Nele você encontrará:

  • bin/magento magenteiro:logExample – com exemplo de uso dos logs comuns no Magento 2
  • bin/magento magenteiro:logCustomExample – com exemplo do nosso log customizado
  • bin/magento magenteiro:logZendLogExample – com exemplo “ruim” de uso da classe Zend\Log direto no método, sem injeção de dependência

 

 

 

Ricardo Martins

Desenvolvedor web há mais de 15 anos, desde 2011 totalmente especializado em Magento, ajudo na criação de conteúdo, e cursos online sobre Magento - hoje com mais de 7000 alunos de 97 países - e criador do módulo PagSeguro Transparente para Magento, usado em mais de 12 mil lojas.

Últimos posts por Ricardo Martins (exibir todos)

Comentários