Registro para Go (Golang): melhores soluções
Registro é uma parte fundamental de qualquer aplicação séria. No ecossistema Go (Golang), existem muitas bibliotecas, cada uma oferecendo seu próprio equilíbrio entre desempenho, flexibilidade e usabilidade. Neste artigo, veremos as melhores soluções para registro em Go, desde a biblioteca padrão até ferramentas de alto desempenho, como zerolog e zap.
Biblioteca padrão: log
Go vem com o pacote embutido log. Ele é simples, mas tem limitações: ausência de níveis de registro (Debug, Info, Warn, Error), sem suporte para saída estruturada (JSON) e capacidades mínimas de formatação. No entanto, para projetos pequenos ou depuração rápida, é perfeitamente adequado.
package main
import ( "log")
func main() { log.Println("Esta é uma mensagem informativa") log.Fatalln("Erro fatal, a aplicação será encerrada")}Prós: não requer instalação, dependência zero.
Contras: baixa flexibilidade, ausência de níveis de registro, sem logs estruturados.
Logrus — clássico com amplas capacidades
Logrus foi por muito tempo o padrão de facto para registro em Go. Ele fornece níveis de registro, suporte para formato JSON e vários hooks para integração com sistemas externos (Logstash, Sentry, etc.).
package main
import ( "github.com/sirupsen/logrus")
func main() { log := logrus.New() log.SetFormatter(&logrus.JSONFormatter{})
log.WithFields(logrus.Fields{ "user_id": 123, "action": "login", }).Info("Usuário entrou no sistema")}Prós: API rica, muitos hooks, suporte para logs estruturados.
Contras: desempenho relativamente baixo, tamanho grande do arquivo binário.
Zerolog — alto desempenho e zero alocações
Zerolog (dos criadores do RSocket) é uma biblioteca que coloca o desempenho em primeiro lugar. Ela usa o princípio de "zero allocation" (nenhuma alocação de memória) para caminhos críticos, o que a torna uma das mais rápidas em Go. Zerolog é ideal para microsserviços e sistemas de alta carga.
package main
import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log")
func main() { // Configuração do logger global zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Info(). Str("service", "auth"). Int("user_id", 456). Msg("Requisição autorizada")
// Registro de erros err := someFunction() if err != nil { log.Error().Err(err).Msg("Não foi possível executar a operação") }}
func someFunction() error { return nil}Prós: desempenho recorde, baixo consumo de memória, API simples.
Contras: menos flexível que Logrus, requer adaptação à sintaxe encadeada.
Zap — padrão industrial da Uber
Zap (Zap Awesome Performance) foi desenvolvido por engenheiros da Uber. Ele oferece dois modos: SugaredLogger (conveniente, mas com pequena sobrecarga) e Logger (o mais rápido possível). Zap suporta logs estruturados, níveis e codificadores personalizados.
package main
import ( "go.uber.org/zap")
func main() { // Criando o logger (modo Production) logger, _ := zap.NewProduction() defer logger.Sync() // libera o buffer, se houver
// SugaredLogger — sintaxe conveniente sugar := logger.Sugar() sugar.Infow("Servidor iniciado", "port", 8080, "env", "production", )
// Logger — desempenho máximo logger.Info("Evento chave", "status", "ok", "latency_ms", 42, )}Prós: alto desempenho, dois modos de uso, ampla adoção na indústria.
Contras: API mais complexa que zerolog, necessidade de escolher entre modos.
Também na biblioteca
CoreLocation para Swift: guia completo com exemplos
Programação Reativa em C++: Bibliotecas e Prática
SwiftFormat para Swift: guia completo com exemplos práticos