- Notifications
You must be signed in to change notification settings - Fork1.5k
Blazing fast, structured, leveled logging in Go.
License
uber-go/zap
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
go get -u go.uber.org/zap
Note that zap only supports the two most recent minor versions of Go.
In contexts where performance is nice, but not critical, use theSugaredLogger. It's 4-10x faster than other structured loggingpackages and includes both structured andprintf-style APIs.
logger,_:=zap.NewProduction()deferlogger.Sync()// flushes buffer, if anysugar:=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)
When performance and type safety are critical, use theLogger. It's evenfaster than theSugaredLogger and allocates far less, but it only supportsstructured logging.
logger,_:=zap.NewProduction()deferlogger.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),)
See thedocumentation andFAQ for more details.
For applications that log in the hot path, reflection-based serialization andstring formatting are prohibitively expensive — they're CPU-intensiveand make many small allocations. Put differently, usingencoding/json andfmt.Fprintf to log tons ofinterface{}s makes your application slow.
Zap takes a different approach. It includes a reflection-free, zero-allocationJSON encoder, and the baseLogger strives to avoid serialization overheadand allocations wherever possible. By building the high-levelSugaredLoggeron that foundation, zap lets userschoose when they need to count everyallocation and when they'd prefer a more familiar, loosely typed API.
As measured by its ownbenchmarking suite, not only is zap more performantthan comparable structured logging packages — it's also faster than thestandard library. Like all benchmarks, take these with a grain of salt.1
Log a message and 10 fields:
| Package | Time | Time % to zap | Objects Allocated |
|---|---|---|---|
| ⚡ zap | 656 ns/op | +0% | 5 allocs/op |
| ⚡ zap (sugared) | 935 ns/op | +43% | 10 allocs/op |
| zerolog | 380 ns/op | -42% | 1 allocs/op |
| go-kit | 2249 ns/op | +243% | 57 allocs/op |
| slog (LogAttrs) | 2479 ns/op | +278% | 40 allocs/op |
| slog | 2481 ns/op | +278% | 42 allocs/op |
| apex/log | 9591 ns/op | +1362% | 63 allocs/op |
| log15 | 11393 ns/op | +1637% | 75 allocs/op |
| logrus | 11654 ns/op | +1677% | 79 allocs/op |
Log a message with a logger that already has 10 fields of context:
| Package | Time | Time % to zap | Objects Allocated |
|---|---|---|---|
| ⚡ zap | 67 ns/op | +0% | 0 allocs/op |
| ⚡ zap (sugared) | 84 ns/op | +25% | 1 allocs/op |
| zerolog | 35 ns/op | -48% | 0 allocs/op |
| slog | 193 ns/op | +188% | 0 allocs/op |
| slog (LogAttrs) | 200 ns/op | +199% | 0 allocs/op |
| go-kit | 2460 ns/op | +3572% | 56 allocs/op |
| log15 | 9038 ns/op | +13390% | 70 allocs/op |
| apex/log | 9068 ns/op | +13434% | 53 allocs/op |
| logrus | 10521 ns/op | +15603% | 68 allocs/op |
Log a static string, without any context orprintf-style templating:
| Package | Time | Time % to zap | Objects Allocated |
|---|---|---|---|
| ⚡ zap | 63 ns/op | +0% | 0 allocs/op |
| ⚡ zap (sugared) | 81 ns/op | +29% | 1 allocs/op |
| zerolog | 32 ns/op | -49% | 0 allocs/op |
| standard library | 124 ns/op | +97% | 1 allocs/op |
| slog | 196 ns/op | +211% | 0 allocs/op |
| slog (LogAttrs) | 200 ns/op | +217% | 0 allocs/op |
| go-kit | 213 ns/op | +238% | 9 allocs/op |
| apex/log | 771 ns/op | +1124% | 5 allocs/op |
| logrus | 1439 ns/op | +2184% | 23 allocs/op |
| log15 | 2069 ns/op | +3184% | 20 allocs/op |
All APIs are finalized, and no breaking changes will be made in the 1.x seriesof releases. Users of semver-aware dependency management systems should pinzap to^1.
We encourage and support an active, healthy community of contributors —including you! Details are in thecontribution guide andthecode of conduct. The zap maintainers keep an eye onissues and pull requests, but you can also report any negative conduct tooss-conduct@uber.com. That email list is a private, safe space; even the zapmaintainers don't have access, so don't hesitate to hold us to a highstandard.
Released under theMIT License.
1 In particular, keep in mind that we may bebenchmarking against slightly older versions of other packages. Versions arepinned in thebenchmarks/go.mod file.↩
About
Blazing fast, structured, leveled logging in Go.
Topics
Resources
License
Code of conduct
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
