Registro increíblemente rápido, estructurado y nivelado en Go.
go get -u go.uber.org/zap
Tenga en cuenta que zap sólo admite las dos versiones menores más recientes de Go.
En contextos donde el rendimiento es bueno, pero no crítico, utilice SugaredLogger
. Es entre 4 y 10 veces más rápido que otros paquetes de registro estructurados e incluye API tanto estructuradas como de 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 )
Cuando el rendimiento y la seguridad del tipo sean críticos, utilice el Logger
. Es incluso más rápido que SugaredLogger
y asigna mucho menos, pero solo admite registros estructurados.
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 la documentación y las preguntas frecuentes para obtener más detalles.
Para las aplicaciones que inician sesión en la ruta activa, la serialización basada en reflexión y el formateo de cadenas son prohibitivamente costosos: consumen mucha CPU y realizan muchas asignaciones pequeñas. Dicho de otra manera, usar encoding/json
y fmt.Fprintf
para registrar toneladas de interface{}
hace que su aplicación sea lenta.
Zap adopta un enfoque diferente. Incluye un codificador JSON sin reflejos y sin asignación, y el Logger
base se esfuerza por evitar la sobrecarga de serialización y las asignaciones siempre que sea posible. Al construir el SugaredLogger
de alto nivel sobre esa base, zap permite a los usuarios elegir cuándo necesitan contar cada asignación y cuándo preferirían una API más familiar y de tipo flexible.
Según lo medido por su propio conjunto de evaluaciones comparativas, zap no solo tiene mejor rendimiento que los paquetes de registro estructurado comparables, sino que también es más rápido que la biblioteca estándar. Como todos los puntos de referencia, tómelos con cautela. 1
Registre un mensaje y 10 campos:
Paquete | Tiempo | % de tiempo para realizar zapping | Objetos asignados |
---|---|---|---|
⚡ zapear | 656 ns/operativo | +0% | 5 asignaciones/operación |
⚡ zap (azucarado) | 935 ns/operativo | +43% | 10 asignaciones/operación |
registro cero | 380 ns/operación | -42% | 1 asignaciones/operación |
kit de viaje | 2249 ns/operativo | +243% | 57 asignaciones/operación |
trabajo duro (LogAttrs) | 2479 ns/operativo | +278% | 40 asignaciones/operación |
sudar tinta | 2481 ns/operativo | +278% | 42 asignaciones/operación |
ápice/registro | 9591 ns/operativo | +1362% | 63 asignaciones/operación |
registro15 | 11393 ns/operativo | +1637% | 75 asignaciones/operación |
logro | 11654 ns/operativo | +1677% | 79 asignaciones/operación |
Registre un mensaje con un registrador que ya tenga 10 campos de contexto:
Paquete | Tiempo | % de tiempo para realizar zapping | Objetos asignados |
---|---|---|---|
⚡ zapear | 67 ns/op | +0% | 0 asignaciones/operación |
⚡ zap (azucarado) | 84 ns/op | +25% | 1 asignaciones/operación |
registro cero | 35 ns/op | -48% | 0 asignaciones/operación |
sudar tinta | 193 ns/op | +188% | 0 asignaciones/operación |
trabajo duro (LogAttrs) | 200 ns/operación | +199% | 0 asignaciones/operación |
kit de viaje | 2460 ns/operativo | +3572% | 56 asignaciones/operación |
registro15 | 9038 ns/operativo | +13390% | 70 asignaciones/operación |
ápice/registro | 9068 ns/operativo | +13434% | 53 asignaciones/operación |
logro | 10521 ns/operativo | +15603% | 68 asignaciones/operación |
Registre una cadena estática, sin ningún contexto ni plantilla de estilo printf
:
Paquete | Tiempo | % de tiempo para realizar zapping | Objetos asignados |
---|---|---|---|
⚡ zapear | 63 ns/op | +0% | 0 asignaciones/operación |
⚡ zap (azucarado) | 81 ns/op | +29% | 1 asignaciones/operación |
registro cero | 32 ns/op | -49% | 0 asignaciones/operación |
biblioteca estándar | 124 ns/op | +97% | 1 asignaciones/operación |
sudar tinta | 196 ns/op | +211% | 0 asignaciones/operación |
trabajo duro (LogAttrs) | 200 ns/operación | +217% | 0 asignaciones/operación |
kit de viaje | 213 ns/op | +238% | 9 asignaciones/operación |
ápice/registro | 771 ns/op | +1124% | 5 asignaciones/operación |
logro | 1439 ns/operativo | +2184% | 23 asignaciones/operación |
registro15 | 2069 ns/operativo | +3184% | 20 asignaciones/operación |
Todas las API están finalizadas y no se realizarán cambios importantes en la serie de versiones 1.x. Los usuarios de sistemas de gestión de dependencias compatibles con semver deben fijar zap en ^1
.
Alentamos y apoyamos una comunidad activa y saludable de contribuyentes, ¡incluido usted! Los detalles se encuentran en la guía de contribuciones y en el código de conducta. Los mantenedores de zap vigilan los problemas y las solicitudes de extracción, pero también puede informar cualquier conducta negativa a [email protected]. Esa lista de correo electrónico es un espacio privado y seguro; Incluso los mantenedores de zap no tienen acceso, así que no duden en exigirnos un alto nivel.
Publicado bajo la licencia MIT.
1 En particular, tenga en cuenta que es posible que estemos comparando versiones ligeramente anteriores de otros paquetes. Las versiones están fijadas en el archivo benchmarks/go.mod. ↩