Registro extremamente rápido, estruturado e nivelado em Go.
go get -u go.uber.org/zap
Observe que o zap oferece suporte apenas às duas versões secundárias mais recentes do Go.
Em contextos onde o desempenho é bom, mas não crítico, use SugaredLogger
. É 4 a 10 vezes mais rápido do que outros pacotes de registro estruturado e inclui APIs estruturadas e estilo printf
.
logger , _ := zap . NewProduction ()
defer logger . Sync () // flushes buffer, if any
sugar := logger . Sugar ()
sugar . Infow ( "failed to fetch URL" ,
// Structured context as loosely typed key-value pairs.
"url" , url ,
"attempt" , 3 ,
"backoff" , time . Second ,
)
sugar . Infof ( "Failed to fetch URL: %s" , url )
Quando o desempenho e a segurança do tipo forem críticos, use o Logger
. É ainda mais rápido que o SugaredLogger
e aloca muito menos, mas suporta apenas registro estruturado.
logger , _ := zap . NewProduction ()
defer logger . Sync ()
logger . Info ( "failed to fetch URL" ,
// Structured context as strongly typed Field values.
zap . String ( "url" , url ),
zap . Int ( "attempt" , 3 ),
zap . Duration ( "backoff" , time . Second ),
)
Consulte a documentação e as perguntas frequentes para obter mais detalhes.
Para aplicativos que fazem login no caminho ativo, a serialização baseada em reflexão e a formatação de strings são proibitivamente caras — elas consomem muita CPU e fazem muitas alocações pequenas. Em outras palavras, usar encoding/json
e fmt.Fprintf
para registrar toneladas de interface{}
torna seu aplicativo lento.
Zap adota uma abordagem diferente. Ele inclui um codificador JSON de alocação zero e sem reflexão, e o Logger
base se esforça para evitar sobrecarga de serialização e alocações sempre que possível. Ao construir o SugaredLogger
de alto nível sobre essa base, o zap permite que os usuários escolham quando precisam contar cada alocação e quando preferem uma API mais familiar e de tipo livre.
Conforme medido por seu próprio conjunto de benchmarking, o zap não só tem melhor desempenho do que pacotes de registro estruturado comparáveis, como também é mais rápido do que a biblioteca padrão. Como todos os benchmarks, considere-os com cautela. 1
Registrar uma mensagem e 10 campos:
Pacote | Tempo | Tempo% para zerar | Objetos alocados |
---|---|---|---|
⚡zap | 656 ns/operacional | +0% | 5 alocações/op |
⚡ zap (açucarado) | 935 ns/operacional | +43% | 10 alocações/operação |
registro zero | 380 ns/op | -42% | 1 alocação/operação |
kit de viagem | 2249 ns/op | +243% | 57 alocações/operações |
slog (LogAttrs) | 2479 ns/operacional | +278% | 40 alocações/operação |
trabalho árduo | 2481 ns/operacional | +278% | 42 alocações/operações |
ápice/log | 9591 ns/op | +1362% | 63 alocações/operações |
registro15 | 11393 ns/operacional | +1637% | 75 alocações/operações |
logro | 11654 ns/operacional | +1677% | 79 alocações/operações |
Registre uma mensagem com um logger que já possui 10 campos de contexto:
Pacote | Tempo | Tempo% para zerar | Objetos alocados |
---|---|---|---|
⚡zap | 67 ns/op | +0% | 0 alocações/operações |
⚡ zap (açucarado) | 84 ns/op | +25% | 1 alocação/operação |
registro zero | 35 ns/op | -48% | 0 alocações/operações |
trabalho árduo | 193 ns/op | +188% | 0 alocações/operações |
slog (LogAttrs) | 200 ns/op | +199% | 0 alocações/operações |
kit de viagem | 2460 ns/operacional | +3572% | 56 alocações/operações |
registro15 | 9038 ns/operacional | +13390% | 70 alocações/operações |
ápice/log | 9068 ns/op | +13434% | 53 alocações/operações |
logro | 10521 ns/operacional | +15603% | 68 alocações/operações |
Registre uma string estática, sem qualquer contexto ou modelo de estilo printf
:
Pacote | Tempo | Tempo% para zerar | Objetos alocados |
---|---|---|---|
⚡zap | 63 ns/op | +0% | 0 alocações/operações |
⚡ zap (açucarado) | 81 ns/op | +29% | 1 alocação/operação |
registro zero | 32 ns/op | -49% | 0 alocações/operações |
biblioteca padrão | 124 ns/op | +97% | 1 alocação/operação |
trabalho árduo | 196 ns/op | +211% | 0 alocações/operações |
slog (LogAttrs) | 200 ns/op | +217% | 0 alocações/operações |
kit de viagem | 213 ns/op | +238% | 9 alocações/op |
ápice/log | 771 ns/operacional | +1124% | 5 alocações/op |
logro | 1439 ns/operacional | +2.184% | 23 alocações/operações |
registro15 | 2069 ns/operacional | +3184% | 20 alocações/operação |
Todas as APIs foram finalizadas e nenhuma alteração significativa será feita na série de versões 1.x. Os usuários de sistemas de gerenciamento de dependências semver-aware devem fixar zap em ^1
.
Incentivamos e apoiamos uma comunidade ativa e saudável de colaboradores — incluindo você! Os detalhes estão no guia de contribuição e no código de conduta. Os mantenedores do zap ficam de olho nos problemas e nas solicitações de pull, mas você também pode denunciar qualquer conduta negativa para [email protected]. Essa lista de e-mail é um espaço privado e seguro; mesmo os mantenedores do zap não têm acesso, então não hesite em nos exigir um alto padrão.
Lançado sob a licença MIT.
1 Em particular, tenha em mente que podemos estar comparando versões um pouco mais antigas de outros pacotes. As versões são fixadas no arquivo benchmarks/go.mod. ↩