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/