39/100 Dias de Golang - Logging com Zap
Table of Contents
#
Logging com Zap
Zap é uma biblioteca de logging criada e mantida pela Uber, projetada com foco em velocidade, eficiência e estrutura. É uma das bibliotecas de log mais rápidas para Go, segundo benchmarks do próprio repositório do Zap. Possui facilita integração com sistemas como ELK, Grafana Loki, Datadog, …
Vamos criar um projeto e instalar o Zap:
go get go.uber.org/zap
Veja como fica o código usando o SugaredLogger
package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
sugar := logger.Sugar()
userID := 42
sugar.Infow("Usuário logado",
"user_id", userID,
"role", "admin",
)
sugar.Infof("Conectado ao banco com sucesso. user_id=%d", userID)
}
Veja a saída:
{"level":"info","ts":1745258155.6335487,"caller":"log/main.go:14","msg":"Usuário logado","user_id":42,"role":"admin"}
{"level":"info","ts":1745258155.6336615,"caller":"log/main.go:19","msg":"Conectado ao banco com sucesso. user_id=42"}
Veja agora um exemplo com o Logger
package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("Usuário logado",
zap.Int("user_id", 42),
zap.String("role", "admin"),
)
}
A saída de ambas é igual
{"level":"info","ts":1745258301.69562,"caller":"log/main.go:11","msg":"Usuário logado","user_id":42,"role":"admin"}
A diferença entre o SugaredLogger
e o Logger
está principalmente no desempenho e na conveniência do uso das ferramentas. O Logger
é fortemente tipado, temos que usar os Fields para definir o tipo na mensagem. É ideal para aplicações que necessitam de alta performance.
logger.Info("Usuário logado",
zap.String("user", "joao"),
zap.Int("id", 42),
)
Já o SugaredLogger
possui uma forma mais flexível. Aceita formatação dinâmica e parâmetros variados, porém ele é menos performático que o Logger
sugar.Infow("Usuário logado",
"user", "Victor",
"id", 42,
)