Registro em Aplicações Go: Melhores Práticas
Registro (logging) é uma das pedras angulares de qualquer aplicação de produção. Ele ajuda a rastrear erros, analisar o comportamento do sistema e realizar auditorias. Em Go, devido à sua simplicidade e desempenho, a abordagem de registro tem suas particularidades. Neste artigo, analisaremos as melhores práticas de registro em Go (Golang), consideraremos bibliotecas populares e forneceremos exemplos de código que o ajudarão a construir um sistema de monitoramento confiável.
Por que o pacote padrão log nem sempre é a melhor escolha?
O pacote embutido log em Go é simples e conveniente para tarefas básicas. No entanto, para aplicações de produção, ele tem várias limitações:
- Ausência de níveis de registro (debug, info, warn, error).
- Sem suporte para dados estruturados (JSON, key-value).
- Dificuldades na configuração de saída (por exemplo, em vários arquivos ou em um sistema de coleta de logs).
- Potenciais problemas de desempenho sob altas cargas.
Para projetos sérios, recomenda-se usar uma das bibliotecas especializadas.
Melhores bibliotecas para registro em Go
No ecossistema Go, existem várias bibliotecas bem estabelecidas. Vamos considerar as três mais populares:
1. Logrus
Uma das primeiras bibliotecas que trouxe registro estruturado para Go. Logrus suporta níveis, formatação (JSON, Text) e hooks para integração com serviços externos (por exemplo, Sentry).
package main
import ( "github.com/sirupsen/logrus")
func main() { log := logrus.New() log.SetFormatter(&logrus.JSONFormatter{}) log.SetLevel(logrus.DebugLevel)
log.WithFields(logrus.Fields{ "user_id": 123, "action": "login", }).Info("Usuário fez login no sistema")}2. Zap (Uber)
Zap da Uber é uma biblioteca de alto desempenho focada em velocidade. Ela oferece duas APIs: SugaredLogger (conveniente, um pouco mais lento) e Logger (desempenho máximo). Zap é ideal para serviços de alta carga.
package main
import ( "go.uber.org/zap")
func main() { logger, _ := zap.NewProduction() defer logger.Sync() // flushes buffer, if any
logger.Info("Requisição processada", zap.String("path", "/api/v1/users"), zap.Int("status", 200), zap.Duration("duration", 0.5), )}3. Zerolog
Zerolog é outra biblioteca focada em desempenho e alocação mínima de memória. Ela fornece uma fluent API e excelente suporte para logs JSON "prontos para uso".
package main
import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log")
func main() { zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Debug(). Int("user_id", 456). Str("role", "admin"). Msg("Recebida requisição de exclusão")}Melhores práticas de registro em Go
Independentemente da biblioteca escolhida, vale a pena seguir as seguintes regras:
1. Use logs estruturados (JSON)
Logs de texto são difíceis de analisar e processar. O formato JSON permite fácil integração com sistemas de coleta de logs (ELK, Loki, Datadog) e fazer consultas complexas.
// Ruimlog.Printf("User %d logged in", userID)
// Bom (com Zap)logger.Info("user logged in", zap.Int("user_id", userID))2. Escolha corretamente o nível de registro
- Debug — para desenvolvimento e depuração (não ativar em produção).
- Info — para eventos normais (requisições, inicialização do servidor).
- Warn — para problemas potenciais (baixa memória disponível).