Como Configurar os Logs de Erro do Laravel para Rocket.Chat

Abraçando o open source.

Esron Silva
sysvale
5 min readMay 15, 2020

--

TL/DR: Criamos um pacote PHP, as instruções para instalação estão no README do pacote.

Recentemente, aqui na Sysvale, mudamos nossa plataforma de comunicação oficial do Slack para o Rocket.Chat. Tomamos essa decisão pois agora que estamos 100% remoto #StayAtHome, a limitação do plano grátis do Slack de mostrar apenas as últimas 10 mil mensagens estava atrapalhando o nosso fluxo de trabalho.

Depois de uma extensa pesquisa e testes com várias plataformas chegamos a conclusão que o ideal seria hospedar uma instância do Rocket Chat em um servidor controlado por nós. Logo, tivemos que migrar nossas integrações para o mesmo.

Neste artigo eu explico como foi o processo de migração das notificações de erro nos nossos projetos.

Primeiro, irei conceituar brevemente o Rocket Chat, para quem ainda não o conhece. Em seguida, escrevo um pouco sobre como o Laravel trabalha os logs. Por fim, elaboro um pouco sobre a implementação do nosso pacote.

O que é o Rocket Chat?

O Rocket.Chat é uma ferramenta de colaboração entre times, open source e altamente escalável. Aplicações como essas eliminam a necessidade de alguns emails, reuniões, murais físicos… Além de separar bem a vida pessoal da vida profissional substituindo conversas por Whatsapp.

Apesar de possuir diversas integrações out of the box com ferramentas como GitLab, Trello, Jenkins, etc…, algumas mais específicas como o Laravel precisam de um pouco de adaptação.

É aí que entram os webhooks, que são rotas HTTP que, ao receber requisições, podem executar uma tarefa. No caso do Rocket Chat, um script Javascript é executado, podendo notificar um usuário ou um canal com uma mensagem estilizada.

Vamos aprender como funcionam os logs no Laravel e como podemos configura-lo para enviar as mensagens de erro para o Rocket Chat.

Como funcionam os logs do Laravel?

Under the hood, Laravel utilizes the Monolog library, which provides support for a variety of powerful log handlers…

Ou seja, o Laravel utiliza, internamente, a biblioteca Monolog, que provê suporte para uma variedade de manipuladores de logs.

De forma bastante resumida, no Laravel é possível “loggar” uma mensagem utilizando a Facade Log :

As mensagens de log seguem o padrão estabelecido no RFC 5424, com oito níveis de importância, sendo o mais prioritário o emergency e o menos prioritário o debug.

Também é possível direcionar as mensagens para canais específicos:

ou para uma série de canais:

Esses canais, por sua vez, são configurados no arquivo logging.php, no diretório config, na raiz do projeto.

Um canal importante nessa configuração é o canal stack que redireciona as mensagens para mais de um canal.

Por padrão, quando acontece uma exception no Laravel é escrita uma mensagem no canal padrão de logs com nível error , podemos nos aproveitar disso configurando o canal stack como canal padrão e incluindo um canal criado por nós utilizando uma classe handler Monolog customizada ou provida por um pacote PHP.

Vale a pena da uma conferida na documentação sobre logs do Laravel.

Implementando uma classe handler da Monolog

Dando uma olhada no repositório da Monolog, encontrei um guia de como criar um manipulador de mensagens de log. Foi bem fácil, inclusive, é possível encontrar uma classe de exemplo que podemos utilizar como base.

Seguindo o principio DRY, pesquisei também se já não existia algum projeto pronto. Encontrei dois projetos bacanas na minha pesquisa e utilizei eles como inspiração.

Do repositório abaixo tirei a estrutura do README:

E deste outro tirei a ideia de utilizar o Guzzle para fazer uma requisição HTTP para o nosso servidor do Rocket Chat:

Essa é a função write do pacote criado na Sysvale:

Trecho de código com a implementação da função write

O atributo $this->level, que é passado pelo construtor da classe e configurado no arquivo logging.php, serve para que as mensagens no Rocket Chat tenham uma barra lateral colorida seguindo o seguinte mapeamento:

Mapeamento dos níveis de logs para cores hexadecimais

O atributo $this->client, é um cliente HTTP Guzzle.

O atributo $this->webhooks é um Array PHP contendo os endereços dos webhooks que essa classe vai notificar, ele também é configurado no arquivo logging.php.

Os campos dentro do array "attachments" são retirados dos exemplos da documentação do Rocket Chat para integrações via webhooks.

Mais instruções sobre como configurar o pacote podem ser encontradas na página do pacote Sysvale/rocketchat-monolog-handler no GitHub ou Packagist.

Pacote PHP

A cultura da Sysvale incentiva a contribuição para a comunidade Open Source. Por isso, e para honrar o princípio DRY, resolvemos implementar a nossa versão de uma classe handler para Monolog e deixá-la pública:

Essa é a primeira versão desse pacote e a ideia é evolui-lo para que ele seja mais configurável e que as mensagens fiquem melhor formatadas.

Sinta-se livre para contribuir ❤

Conclusão

Laravel é um framework robusto e altamente configurável. Com um pouco de leitura da sua vasta documentação e um pouco de pesquisa nos fóruns, é possível fazer virtualmente tudo com ele. Integrar uma ferramenta de log alternativa não foi muito difícil.

O Rocket Chat é uma ferramenta de primeira linha e atendeu todas as nossas expectativas, até agora, pois conta com várias integrações já prontas e uma documentação abrangente. Estamos aprendendo mais a cada dia como podemos melhorar nossos fluxos de trabalho utilizando essa ferramenta.

Entender como as engrenagens do seu framework favorito funcionam é uma ótima forma de aprender como melhorar suas aplicações, e esse foi o caso com essa experiência que tive.

Agradeço pela a sua atenção e volte sempre. Se você quiser pode deixar umas palmas aí pra gente 👏 👏 👏

Se esse artigo te ajudou em algo, compartilhe ele com quem você acha que vai se beneficiar também. Obrigado!

--

--

Esron Silva
sysvale

Computer Engineer — Web Developer — Amateur Writer