Executando verificação de segurança...
6

Pitch: Discord Logger, uma biblioteca em go para registro de logs

Há algumas semanas comecei a desenvolver uma biblioteca para trabalhar com erros em minhas aplicações escritas em Go (Golang), deixo um relato do desenvolvimento abaixo.

Linguagens como Go e Rust, são extremamente exigentes com tratamento de erros, acho que a maioria das linguagens oferece suporte a sintaxe Try / Catch

É muito comum acharmos algum código com um bloco Try / Catch gigante tentando tratar todos os erros em um único lugar.

Isso é extramente contra a maioria dos padrões de código, devemos sempre pensar que cada operação que possa ocasionar um erro, deve ser tratada de forma isolada.

Podemos dizer que é seguindo esse principio que Go e Rust trabalham, devemos observar se durante a chamada de uma determinada função ocorreu erro.

Fatal e Panic são métodos fantásticos nessas linguagens, para casos onde queremos suprimir o erro, afinal nem sempre podemos tratar o erro e a única alternativa é encerrar o programa.

Agora falando mais especificamente sobre Go, a linguagem nos fornece nativamente um pacote para log bem completo.

A ideia de criar um novo logger surgiu quando, precisei analisar os logs de uma aplicação própria; inicialmente estava pensando apenas em melhorar a experiência de analisar os logs gerados.

Para isso queria usar logs estruturados por eventos, até cheguei a implementar a gravação de conteúdo dos eventos no formato JSON e YAML, mas ainda não tinha ficado algo visualmente legal.

Decidi seguir com uma ideia de tratar os logs como emails, onde cada log deveria conter um assunto, uma mensagem e o erro caso tivesse algum.

A experiência ficou legal, pois tem um rastreamento do erro (StackTrace) e é possível passar metadados no meio da mensagem.

Como o intuito era criar algo reutilizável por outras pessoas, não seria legal forçar um padrão de log. Pensando nisso desenvolvi uma função que permite modificar o formato do log.

Com o decorrer dos dias, pensei em criar um mecanismo de notificação para quando tivesse um novo log, assim em tese poderia receber os eventos em tempo real.

O Discord é um serviço extremamente Plug & Play, assim como o Telegram é muito fácil fazer uma aplicação interagir com a plataforma.

Como uso muito o Discord no meu dia a dia, decidi criar esse sistema de notificação usando o próprio serviço como fonte centralizadora dos logs.

O resultado ficou melhor do que o esperava, o projeto finalizou com as seguintes funcionalidades.

A biblioteca possui 5 níveis de eventos padrão:

  • Info (Informativo)
  • Warn (Aviso)
  • Error (Erro)
  • Fatal (Erro com saída do programa)
  • Panic (Erro com encerramento do programa)

Também suporta nível customizado e formatação customizada.

Atualmente existem dois tipos de comunicação com o Discord, sendo por meio de um Bot ou por meio de um Webhook, esse projeto consegue utilizar os dois métodos.


Esse é um pequeno exemplo de como criar o logger

package main

import (
  "github.com/Lucas-Palomo/go-discord-logger/pkg/message"
  "github.com/Lucas-Palomo/go-discord-logger/pkg/webhook"
  "os"
)

func main() {
  // Create a logger
  logger := webhook.NewLogger(
    webhook.NewWebhook("<https://discord.com/api/webhooks/{webhook.id}/{webhook.token}>"),
  )

  _, err := os.Open("/dev/x")

  if err != nil {
    // Each log event uses a message
    // The message is a structure that contains some information for a better log
    logger.Error(message.NewMessage("Failed to open /dev/x", err, "this is a optional content"))
  }
}

Esse é um exemplo de como recebemos no Discord

Subject: Failed to open /dev/x
Level: INFO
Moment: 2024-05-23T18:09:43-03:00
Content:
    this is a optional content
Error:
    open /dev/x: no such file or directory
Stack Trace:
    /home/palomo/Projects/Personal/discord-logger/pkg/event.go:39 github.com/Lucas-Palomo/discord-logger/pkg.(*Message).addError()
    /home/palomo/Projects/Personal/discord-logger/pkg/event.go:26 github.com/Lucas-Palomo/discord-logger/pkg.NewMessage()
    /home/palomo/Projects/Personal/discord-logger/cmd/discord_logger.go:16 main.main()
    /usr/lib/golang/src/runtime/proc.go:271 runtime.main()
    /usr/lib/golang/src/runtime/asm_amd64.s:1695 runtime.goexit()


Para quem tiver interesse no projeto: https://github.com/Lucas-Palomo/go-discord-logger
Escrevi esse mesmo post no LinkedIn: https://www.linkedin.com/pulse/discord-logger-uma-biblioteca-em-go-para-registro-de-logs-palomo-drmac/

Carregando publicação patrocinada...