Convert Figma logo to code with AI

uber-go logozap

Blazing fast, structured, leveled logging in Go.

21,647
1,420
21,647
144

Top Related Projects

10,371

Zero Allocation JSON Logger

24,520

Structured, pluggable logging for Go.

3,525

Leveled execution logs for Go

1,103

Structured, composable logging for Go

lumberjack is a log rolling package for Go

1,362

Structured logging package for Go.

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

  1. 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),
)
  1. 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")
  1. 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:

  1. Install Zap:

    go get -u go.uber.org/zap
    
  2. Import Zap in your Go file:

    import "go.uber.org/zap"
    
  3. Create a logger and start logging:

    logger, _ := zap.NewProduction()
    defer logger.Sync()
    
    logger.Info("Zap is now ready to use!")
    

Competitor Comparisons

10,371

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.

24,520

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.

3,525

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.

1,103

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.

1,362

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 Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

:zap: zap

Blazing fast, structured, leveled logging in Go.

Zap logo

GoDoc Build Status Coverage Status

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:

PackageTimeTime % to zapObjects Allocated
:zap: zap656 ns/op+0%5 allocs/op
:zap: zap (sugared)935 ns/op+43%10 allocs/op
zerolog380 ns/op-42%1 allocs/op
go-kit2249 ns/op+243%57 allocs/op
slog (LogAttrs)2479 ns/op+278%40 allocs/op
slog2481 ns/op+278%42 allocs/op
apex/log9591 ns/op+1362%63 allocs/op
log1511393 ns/op+1637%75 allocs/op
logrus11654 ns/op+1677%79 allocs/op

Log a message with a logger that already has 10 fields of context:

PackageTimeTime % to zapObjects Allocated
:zap: zap67 ns/op+0%0 allocs/op
:zap: zap (sugared)84 ns/op+25%1 allocs/op
zerolog35 ns/op-48%0 allocs/op
slog193 ns/op+188%0 allocs/op
slog (LogAttrs)200 ns/op+199%0 allocs/op
go-kit2460 ns/op+3572%56 allocs/op
log159038 ns/op+13390%70 allocs/op
apex/log9068 ns/op+13434%53 allocs/op
logrus10521 ns/op+15603%68 allocs/op

Log a static string, without any context or printf-style templating:

PackageTimeTime % to zapObjects Allocated
:zap: zap63 ns/op+0%0 allocs/op
:zap: zap (sugared)81 ns/op+29%1 allocs/op
zerolog32 ns/op-49%0 allocs/op
standard library124 ns/op+97%1 allocs/op
slog196 ns/op+211%0 allocs/op
slog (LogAttrs)200 ns/op+217%0 allocs/op
go-kit213 ns/op+238%9 allocs/op
apex/log771 ns/op+1124%5 allocs/op
logrus1439 ns/op+2184%23 allocs/op
log152069 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. ↩