Introdução ao logging em Go: Zap e Logrus
\n\nLogging é um componente criticamente importante de qualquer aplicação séria. Ele permite monitorar o estado do programa, registrar erros, analisar desempenho e depurar código em ambiente de produção. Na biblioteca padrão do Go existe o pacote log, mas ele possui capacidades limitadas: não há níveis de logging (exceto os primitivos), não há saída estruturada, não há formatos flexíveis. Para resolver esses problemas, foram criadas duas bibliotecas poderosas: Zap (da Uber) e Logrus (um dos primeiros loggers populares).
Neste artigo, vamos detalhar ambas as bibliotecas, seus métodos, exemplos de uso e melhores práticas. Você aprenderá como configurar logging estruturado, como trabalhar com níveis, como adicionar campos contextuais e como evitar erros típicos.
\n\nO que é Zap?
\nZap é uma biblioteca de alto desempenho para logging estruturado da empresa Uber. Ela é focada em velocidade e alocação mínima de memória. O Zap suporta dois modos de operação: SugaredLogger (conveniente, mas um pouco mais lento) e Logger (máximo desempenho).
\n\nO que é Logrus?
\nLogrus é uma das primeiras e mais populares bibliotecas de logging em Go. Ela fornece uma API simples, suporte a níveis, formatadores (JSON, Text) e hooks para integração com sistemas externos (por exemplo, Sentry, Slack). Logrus é mais fácil de aprender, mas perde para Zap em desempenho.
\n\nInstalação
\nA instalação de ambas as bibliotecas é feita da forma padrão através do go get:
// Instalação do Zap\ngo get -u go.uber.org/zap\n\n// Instalação do Logrus\ngo get -u github.com/sirupsen/logrus\n\n\nApós a instalação, você pode importá-las no seu projeto:
\n\nimport (\n "go.uber.org/zap"\n "github.com/sirupsen/logrus"\n)\n\n\nInício rápido com exemplo de código
\n\nExemplo com Zap
\npackage main\n\nimport (\n "go.uber.org/zap"\n)\n\nfunc main() {\n // Criando um logger de produção (alto desempenho)\n logger, _ := zap.NewProduction()\n defer logger.Sync() // libera o buffer antes de sair\n\n // Registrando uma mensagem com campos\n logger.Info("Aplicação iniciada",\n zap.String("version", "1.0.0"),\n zap.Int("port", 8080),\n )\n\n // Usando SugaredLogger para conveniência\n sugar := logger.Sugar()\n sugar.Infow("Usuário fez login",\n "user", "john_doe",\n "ip", "192.168.1.1",\n )\n}\n\n\nExemplo com Logrus
\npackage main\n\nimport (\n "github.com/sirupsen/logrus"\n)\n\nfunc main() {\n // Configurando o formato de saída (JSON)\n logrus.SetFormatter(&logrus.JSONFormatter{})\n\n // Definindo o nível de logging\n logrus.SetLevel(logrus.InfoLevel)\n\n // Registrando uma mensagem com campos\n logrus.WithFields(logrus.Fields{\n "version": "1.0.0",\n "port": 8080,\n }).Info("Aplicação iniciada")\n\n // Registrando um erro\n logrus.WithFields(logrus.Fields{\n "user": "john_doe",\n "ip": "192.168.1.1",\n }).Warn("Tentativa de login com senha incorreta")\n}\n\n\nMétodos e funções principais
\n\n1. Zap: NewProduction() / NewDevelopment()
\nO que faz: Cria um logger pré-configurado para ambiente de produção ou desenvolvimento. O logger de produção usa formato JSON e é otimizado para velocidade. O logger de desenvolvimento usa saída de texto colorida e inclui stack traces.
\nParâmetros: Nenhum (retorna *zap.Logger e um erro).
Exemplo:
\nprodLogger, _ := zap.NewProduction()\ndevLogger, _ := zap.NewDevelopment()\n\n\n2. Zap: Logger.Info(),
Também na biblioteca
Trabalhando com datas em Swift: Foundation e DateFormatter
mapstructure para Go: guia completo com exemplos práticos
Trabalhando com Apache Kafka em C++: biblioteca librdkafka e exemplos práticos
Container de Injeção de Dependência em C++: biblioteca Fruit para injeção de dependências
Fabric: automação de administração com Python
Recommendations
Também na biblioteca
Trabalhando com datas em Swift: Foundation e DateFormatter
mapstructure para Go: guia completo com exemplos práticos
Trabalhando com Apache Kafka em C++: biblioteca librdkafka e exemplos práticos
Container de Injeção de Dependência em C++: biblioteca Fruit para injeção de dependências