Top Related Projects
Quick Overview
Zap is a blazing fast, structured, leveled logging library for Go. It's designed to be both performant and flexible, offering a variety of logging levels and encoding options. Zap aims to provide the best possible performance without sacrificing developer experience or type safety.
Pros
- Extremely high performance, often outperforming other popular logging libraries
- Structured logging with strong typing
- Flexible configuration options for various use cases
- Supports both human-readable and JSON output formats
Cons
- Steeper learning curve compared to simpler logging libraries
- More verbose syntax for basic logging tasks
- May be overkill for small projects or simple logging needs
- Requires more setup and configuration than some alternatives
Code Examples
- Basic logging:
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("Failed to fetch URL",
zap.String("url", url),
zap.Int("attempt", 3),
zap.Duration("backoff", time.Second),
)
- Creating a custom logger:
cfg := zap.Config{
Encoding: "json",
Level: zap.NewAtomicLevelAt(zap.InfoLevel),
OutputPaths: []string{"stdout"},
ErrorOutputPaths: []string{"stderr"},
}
logger, _ := cfg.Build()
defer logger.Sync()
logger.Info("Custom logger created")
- Using sugar for simplified logging:
logger, _ := zap.NewProduction()
defer logger.Sync()
sugar := logger.Sugar()
sugar.Infow("Failed to fetch URL",
"url", url,
"attempt", 3,
"backoff", time.Second,
)
Getting Started
To use Zap in your Go project, follow these steps:
-
Install Zap:
go get -u go.uber.org/zap
-
Import Zap in your Go file:
import "go.uber.org/zap"
-
Create a logger and start logging:
logger, _ := zap.NewProduction() defer logger.Sync() logger.Info("Zap is now ready to use!")
Competitor Comparisons
Zero Allocation JSON Logger
Pros of zerolog
- Simpler API with a more intuitive, fluent interface
- Slightly faster performance in some benchmarks
- Built-in support for JSON logging by default
Cons of zerolog
- Less flexible configuration options
- Fewer built-in features and integrations
- Smaller community and ecosystem compared to zap
Code Comparison
zerolog example:
log := zerolog.New(os.Stdout).With().Timestamp().Logger()
log.Info().Str("key", "value").Msg("Hello World")
zap example:
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("Hello World", zap.String("key", "value"))
Both zap and zerolog are popular logging libraries for Go, offering high-performance structured logging. zap provides more extensive features and configuration options, making it suitable for complex applications. zerolog, on the other hand, offers a simpler API and slightly better performance in some scenarios, making it a good choice for projects prioritizing ease of use and raw speed. The choice between the two often depends on specific project requirements and developer preferences.
Structured, pluggable logging for Go.
Pros of Logrus
- More feature-rich with built-in hooks, formatters, and field types
- Easier to get started with and has a simpler API
- Better compatibility with the standard library's log package
Cons of Logrus
- Generally slower performance compared to Zap
- Less focus on zero-allocation logging, which can impact performance in high-throughput scenarios
Code Comparison
Logrus:
log := logrus.New()
log.WithFields(logrus.Fields{
"animal": "walrus",
}).Info("A walrus appears")
Zap:
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("A walrus appears",
zap.String("animal", "walrus"),
)
Key Differences
- Zap is designed for high-performance, zero-allocation logging, making it more suitable for applications with high throughput requirements
- Logrus offers a more familiar and easier-to-use API, especially for developers coming from other logging libraries
- Zap provides better type safety and compile-time checks, while Logrus offers more flexibility with dynamic fields
Both libraries are popular choices for logging in Go applications, with the choice often depending on specific project requirements and performance needs.
Leveled execution logs for Go
Pros of glog
- Simpler API with fewer configuration options, making it easier to get started
- Built-in support for log rotation and log file management
- Familiar to developers coming from C++ projects using Google's glog library
Cons of glog
- Less performant compared to zap, especially for high-volume logging
- Limited flexibility in log formatting and output customization
- Lacks advanced features like structured logging and field-based logging
Code Comparison
glog example:
import "github.com/golang/glog"
glog.Info("Informational message")
glog.Errorf("Error occurred: %v", err)
glog.V(2).Infoln("Verbose message")
zap example:
import "go.uber.org/zap"
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("Informational message")
logger.Error("Error occurred", zap.Error(err))
logger.Debug("Debug message", zap.Int("verbosity", 2))
The code examples demonstrate the basic usage of both libraries. glog uses global functions and a simpler API, while zap requires creating a logger instance and offers more structured logging with typed fields. zap's approach allows for better performance and more flexible log formatting, but may require more initial setup compared to glog's straightforward global functions.
Structured, composable logging for Go
Pros of log15
- Simpler API and easier to get started with
- Built-in support for structured logging
- Flexible and customizable output formatting
Cons of log15
- Lower performance compared to zap
- Less actively maintained (last commit in 2019)
- Fewer advanced features and optimizations
Code Comparison
log15:
log := log15.New("module", "app/server")
log.Info("server started", "port", 8080)
zap:
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("server started", zap.Int("port", 8080))
Key Differences
- log15 uses a simpler key-value pair approach for structured logging
- zap requires explicit type declarations for fields (e.g.,
zap.Int
) - zap offers better performance and more advanced features
- log15 provides an easier learning curve for beginners
Use Cases
- Choose log15 for simpler projects or when getting started with structured logging
- Opt for zap in high-performance applications or when advanced features are needed
Community and Ecosystem
- zap has a larger community and more frequent updates
- log15 has a smaller but dedicated user base
Both libraries offer structured logging capabilities, but zap excels in performance and advanced features, while log15 provides a simpler API and easier adoption for newcomers to structured logging in Go.
lumberjack is a log rolling package for Go
Pros of Lumberjack
- Focused solely on log file rotation and management
- Simple and lightweight, easy to integrate with existing logging solutions
- Supports compression of rotated log files
Cons of Lumberjack
- Limited functionality compared to Zap's comprehensive logging features
- Lacks built-in structured logging capabilities
- No support for log levels or sampling
Code Comparison
Lumberjack (used with standard log package):
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/foo.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, // days
Compress: true,
})
log.Println("This is a log message")
Zap:
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("This is a log message",
zap.String("key", "value"),
zap.Int("count", 42),
)
Lumberjack focuses on log file management, while Zap provides a full-featured logging solution with structured logging, performance optimizations, and more advanced capabilities. Lumberjack is often used in conjunction with other logging libraries, whereas Zap is a standalone solution for all logging needs.
Structured logging package for Go.
Pros of apex/log
- Simpler API with less configuration required
- Built-in support for multiple output handlers (e.g., CLI, Logfmt, JSON)
- Easier to get started for small to medium-sized projects
Cons of apex/log
- Lower performance compared to zap, especially for high-throughput logging
- Fewer advanced features and customization options
- Less active development and community support
Code Comparison
apex/log:
log.WithFields(log.Fields{
"user": user.ID,
"action": "login",
}).Info("User logged in")
zap:
logger.Info("User logged in",
zap.String("user", user.ID),
zap.String("action", "login"),
)
Summary
apex/log is a simpler logging library that's easier to set up and use for smaller projects. It offers built-in support for multiple output formats and a straightforward API. However, it lacks the performance optimizations and advanced features of zap, making it less suitable for high-throughput or complex logging scenarios. zap, on the other hand, provides better performance and more customization options but requires more initial configuration and has a steeper learning curve.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
:zap: zap
Installation
go get -u go.uber.org/zap
Note that zap only supports the two most recent minor versions of Go.
Quick Start
In contexts where performance is nice, but not critical, use the
SugaredLogger
. It's 4-10x faster than other structured logging
packages and includes both structured and printf
-style APIs.
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)
When performance and type safety are critical, use the Logger
. It's even
faster than the SugaredLogger
and allocates far less, but it only supports
structured logging.
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),
)
See the documentation and FAQ for more details.
Performance
For applications that log in the hot path, reflection-based serialization and
string formatting are prohibitively expensive — they're CPU-intensive
and make many small allocations. Put differently, using encoding/json
and
fmt.Fprintf
to log tons of interface{}
s makes your application slow.
Zap takes a different approach. It includes a reflection-free, zero-allocation
JSON encoder, and the base Logger
strives to avoid serialization overhead
and allocations wherever possible. By building the high-level SugaredLogger
on that foundation, zap lets users choose when they need to count every
allocation and when they'd prefer a more familiar, loosely typed API.
As measured by its own benchmarking suite, not only is zap more performant than comparable structured logging packages — it's also faster than the standard 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: zap | 656 ns/op | +0% | 5 allocs/op |
:zap: 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: zap | 67 ns/op | +0% | 0 allocs/op |
:zap: 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 or printf
-style templating:
Package | Time | Time % to zap | Objects Allocated |
---|---|---|---|
:zap: zap | 63 ns/op | +0% | 0 allocs/op |
:zap: 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 |
Development Status: Stable
All APIs are finalized, and no breaking changes will be made in the 1.x series
of releases. Users of semver-aware dependency management systems should pin
zap to ^1
.
Contributing
We encourage and support an active, healthy community of contributors — including you! Details are in the contribution guide and the code of conduct. The zap maintainers keep an eye on issues and pull requests, but you can also report any negative conduct to oss-conduct@uber.com. That email list is a private, safe space; even the zap maintainers don't have access, so don't hesitate to hold us to a high standard.
Released under the MIT License.
1 In particular, keep in mind that we may be benchmarking against slightly older versions of other packages. Versions are pinned in the benchmarks/go.mod file. â©
Top Related Projects
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot