zerolog para Go: Guia completo de logging com zero alocação
No mundo das aplicações Go de alta carga, o desempenho é fundamental. Cada alocação extra de memória pode aumentar o tempo de execução do garbage collector (GC) e reduzir a capacidade de processamento do serviço. Bibliotecas tradicionais de logging, como log da biblioteca padrão ou a popular logrus, embora convenientes, criam uma carga significativa no heap, alocando memória para cada chamada do logger. É aqui que entra o zerolog — uma biblioteca de logging para Go projetada com foco em zero alocação de memória (zero allocation).
O zerolog oferece aos desenvolvedores uma API poderosa, flexível e incrivelmente rápida para logging estruturado no formato JSON. Ao contrário de muitas alternativas, o zerolog usa uma cadeia de chamadas de métodos (fluent API) e evita interfaces e reflexão em caminhos críticos, permitindo atingir um desempenho próximo à formatação manual de strings. Isso o torna a escolha ideal para microsserviços, gateways de API, servidores proxy e qualquer outro software onde cada microssegundo e cada byte de memória importam.
A biblioteca não é apenas rápida, mas também extremamente conveniente. Ela suporta níveis de logging (debug, info, warn, error, fatal, panic), logging contextual com Logger.With(), integração com o contexto Go (context.Context), além de configuração flexível de saída (console ou JSON). Neste artigo, vamos detalhar como instalar o zerolog, dominar seus principais métodos com exemplos práticos e explorar as melhores práticas para obter o máximo desempenho.
Instalação
A instalação do zerolog, como a maioria das bibliotecas Go, é feita com o gerenciador de pacotes go get. Execute o seguinte comando na raiz do seu projeto (onde está o arquivo go.mod):
go get -u github.com/rs/zerolog/log
Após executar este comando, a biblioteca será adicionada ao seu arquivo go.mod e você poderá importá-la no seu código.
Início rápido: Exemplo mínimo funcional
Vamos começar com o exemplo mais simples, que demonstra o uso básico do zerolog para exibir uma mensagem no formato JSON.
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
// Define o nível global de logging como Debug.
// O padrão é o nível Info.
zerolog.SetGlobalLevel(zerolog.DebugLevel)
// Logging simples de uma string.
log.Print("Olá, zerolog!")
// Logging com nível Info.
log.Info().Msg("Serviço iniciado com sucesso")
// Logging com nível Warn.
log.Warn().Msg("Requisição potencialmente lenta detectada")
// Logging com nível Error.
log.Error().Msg("Não foi possível conectar ao banco de dados")
}
Ao executar este código, você verá no console linhas JSON contendo hora, nível, mensagem e outras informações de serviço. Observe a cadeia de chamadas: log.Info().Msg("..."). Esta é a fluent API que torna o código conciso.
Métodos e funções principais
O zerolog oferece um conjunto rico de métodos para logging flexível e eficiente. Vamos explorar 8 deles.
1. log.Info(), log.Debug(), log.Warn(), log.Error(), log.Fatal(), log.Panic()
Assinatura: func Info() *Event (e similar para outros níveis)
O que faz: Esses métodos criam um novo evento de logging com o nível correspondente. Eles retornam um ponteiro para a estrutura Event, que pode ser enriquecida com campos usando outros métodos (como Str(), Int(), etc.).
Também na biblioteca
Actors em Swift: Guia Completo com Exemplos Práticos
Trabalhando com CSV em Kotlin: bibliotecas e exemplos de código
Migrações de banco de dados em Swift: ferramentas e abordagens para iOS/macOS
Autorização e Autenticação em TypeScript: Guia Completo
GraphQL em Swift: Guia Completo da Biblioteca Apollo iOS