Logging em aplicações Go: melhores práticas na prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que logging em Go não é apenas fmt.Println



Logging são os olhos e ouvidos de qualquer aplicação em produção. No mundo Go (Golang), a abordagem ao logging passou por uma evolução significativa: desde a simples saída no console via fmt.Println até poderosos loggers estruturados, capazes de gerar registros compatíveis com JSON para sistemas centralizados de coleta de logs (ELK, Grafana Loki, Datadog).



Neste artigo, analisaremos as melhores práticas de logging em Go na prática, e não na teoria. Você aprenderá como configurar níveis de logging, usar logs estruturados, evitar "ruído" e tratar erros corretamente. Todos os exemplos de código estão prontos para uso em seus projetos.



1. Biblioteca padrão log: quando ela é suficiente e quando não é



Go fornece o pacote embutido log da biblioteca padrão. Ele é simples, mas tem limitações significativas.



Exemplo básico

package main

import ( "log" "os")

func main() { // Configuração de saída para arquivo file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) defer file.Close() log.SetOutput(file)

log.Println("Aplicação iniciada") log.Printf("Usuário %s autenticado", "admin") log.Fatal("Erro crítico: não foi possível conectar ao BD")}


Vantagens:

  • Não requer instalação de dependências de terceiros.
  • Simplicidade de uso para scripts pequenos ou utilitários CLI.


Desvantagens:

  • Não possui níveis de logging (apenas Print, Fatal, Panic).
  • Formato de saída fixo (data, hora, mensagem).
  • Não possui campos estruturados (chave-valor).
  • Difícil de ser parseado por sistemas de coleta de logs.


Conclusão: para serviços em produção, arquitetura de microsserviços ou qualquer aplicação que exija monitoramento, o log padrão não é adequado. Migre para logging estruturado.



2. Logging estruturado com zerolog: o padrão moderno



A biblioteca zerolog é um dos loggers mais populares e rápidos em Go. Ela suporta níveis de logging, saída JSON por padrão e alocação mínima de memória.



Instalação

go get -u github.com/rs/zerolog/log


Exemplo de configuração e uso

package main

import ( "os" "time"

"github.com/rs/zerolog" "github.com/rs/zerolog/log")

func main() { // Configuração do formato de hora zerolog.TimeFieldFormat = time.RFC3339

// Saída no console com cores (para desenvolvimento) log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339})

// Para produção — JSON no stdout // log.Logger = zerolog.New(os.Stdout).With().Timestamp().Logger()

log.Info().Msg("Servidor iniciado na porta 8080") log.Debug().Str("module", "auth").Msg("Tentativa de login do usuário") log.Error().Err(err).Str("user_id", "12345").Msg("Erro de autenticação") log.Fatal().Int("attempt", 3).Msg("Número máximo de tentativas excedido")}


Níveis de logging no zerolog

  • Trace (log.Trace()) — para depuração profunda.
  • Debug (log.Debug()) — informações de depuração.
  • Info (log.Info()) — eventos normais.
  • Warn (log.Warn()) — avisos (não erros).
  • Error (log.Error()) — erros que exigem atenção.
  • Fatal (log.Fatal()) — erros fatais (encerra o programa).
  • Panic (log.Panic()) — pânico com exibição da pilha.


Melhor prática: em produção, defina o nível mínimo

Blogs

Book Recommendations