Pular para o conteúdo principal

victorstein.dev

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,
)