Registro em aplicações Go: melhores práticas para iniciantes
\n\nO registro (logging) é um dos componentes essenciais de qualquer aplicação séria. Ele ajuda a rastrear erros, analisar o comportamento do sistema e entender o que está acontecendo "sob o capô". Neste artigo, vamos abordar as melhores práticas de registro em Go (Golang) para desenvolvedores iniciantes. Você aprenderá quais bibliotecas usar, como organizar os logs e evitar erros comuns.
\n\nPor que o registro é importante em Go?
\n\nGo é uma linguagem voltada para a criação de aplicações server-side de alta carga e microsserviços. Em tais sistemas, sem um registro de qualidade é impossível:
\n\n- \n
- Encontrar rapidamente a causa de uma falha \n
- Entender a sequência de eventos \n
- Coletar métricas para monitoramento \n
- Depurar código em ambiente de produção \n
Um registro mal configurado pode levar à perda de dados críticos ou, ao contrário, ao preenchimento do disco com milhões de mensagens inúteis. Por isso, é importante estabelecer a arquitetura correta desde o início.
\n\nBiblioteca padrão log
\n\nGo fornece o pacote embutido log, que é adequado para projetos simples. Ele pode exibir mensagens em stdout/stderr, adicionar carimbos de data/hora e encerrar o programa em erros fatais.
package main\n\nimport (\n "log"\n)\n\nfunc main() {\n log.Println("Aplicação iniciada")\n log.Printf("Usuário %s fez login", "admin")\n // log.Fatal("Erro crítico") // encerra o programa\n}\n\nDesvantagens do logger padrão:
\n- \n
- Não possui níveis de registro (debug, info, warn, error) \n
- Não possui saída estruturada (apenas texto) \n
- Difícil alterar o formato e o destino da saída \n
Para projetos de estudo e utilitários simples, isso é suficiente, mas para aplicações de produção é melhor usar bibliotecas mais poderosas.
\n\nBibliotecas populares para registro
\n\nVamos considerar três opções mais comuns.
\n\n1. Logrus
\n\nLogrus é uma das primeiras bibliotecas de terceiros para Go. Ela suporta níveis de registro, campos estruturados e vários formatos de saída (JSON, texto).
\n\npackage main\n\nimport (\n "github.com/sirupsen/logrus"\n)\n\nfunc main() {\n log := logrus.New()\n log.SetFormatter(&logrus.JSONFormatter{})\n log.SetLevel(logrus.InfoLevel)\n\n log.WithFields(logrus.Fields{\n "user": "ivan",\n "action": "login",\n }).Info("Usuário fez login")\n}\n\nLogrus é fácil de usar, mas tem alto consumo de memória e é um pouco mais lento que alternativas modernas.
\n\n2. Zerolog
\n\nZerolog é uma biblioteca moderna focada em desempenho e alocação mínima de memória. Ela usa uma abordagem de zero-alocação e é ideal para sistemas de alta carga.
\n\npackage main\n\nimport (\n "github.com/rs/zerolog"\n "github.com/rs/zerolog/log"\n)\n\nfunc main() {\n zerolog.TimeFieldFormat = zerolog.TimeFormatUnix\n\n log.Info().\n Str("user", "ivan").\n Str("action", "login").\n Msg("Usuário fez login")\n\n log.Error().\n Err(fmt.Errorf("connection refused")).\n Msg("Erro de conexão com o BD")\n}\n\nZerolog gera logs no formato JSON por padrão, o que facilita a análise por sistemas de monitoramento (ELK, Grafana Loki).
\n\n3. Zap
\n\nZap da Uber é outro logger de alto desempenho. Ele opera em dois modos: SugaredLogger (conveniente, mas um pouco mais lento) e Logger (velocidade máxima).
package main\n\nimport (\n "go.uber.org/zap"\n)\n\nfunc main() {\n logger, _ := zap.NewProduction()\n defer logger.Sync()\n\n logger.Info("Servidor iniciado",\n zap.String("port", "8080"),\n zap.Int("workers", 10),\n )\n}\n\nPara n