Skip to content

samber/slog-zap

Folders and files

NameName
Last commit message
Last commit date
Dec 9, 2024
Oct 21, 2023
Sep 18, 2023
Sep 18, 2023
Nov 1, 2023
Sep 9, 2024
Jul 1, 2024
Jan 12, 2025
Jan 12, 2025
Jul 10, 2024
Sep 18, 2023
Oct 25, 2023

Repository files navigation

slog: Zap handler

tag Go Version GoDoc Build Status Go report Coverage Contributors License

A zap Handler for slog Go library.

See also:

HTTP middlewares:

Loggers:

Log sinks:

πŸš€ Install

go get github.com/samber/slog-zap/v2

Compatibility: go >= 1.21

No breaking changes will be made to exported APIs before v3.0.0.

πŸ’‘ Usage

GoDoc: https://pkg.go.dev/github.com/samber/slog-zap/v2

Handler options

type Option struct {
	// log level (default: debug)
	Level slog.Leveler

	// optional: zap logger (default: zap.L())
	Logger *zap.Logger

	// optional: customize json payload builder
	Converter Converter
    // optional: fetch attributes from context
    AttrFromContext []func(ctx context.Context) []slog.Attr

	// optional: see slog.HandlerOptions
	AddSource   bool
	ReplaceAttr func(groups []string, a slog.Attr) slog.Attr
}

Other global parameters:

slogzap.SourceKey = "source"
slogzap.ErrorKeys = []string{"error", "err"}
slogzap.LogLevels = map[slog.Level]zapcore.Level{...}

Example

import (
    slogzap "github.com/samber/slog-zap/v2"
    "go.uber.org/zap"
    "log/slog"
)

func main() {
    zapLogger, _ := zap.NewProduction()

    logger := slog.New(slogzap.Option{Level: slog.LevelDebug, Logger: zapLogger}.NewZapHandler())
    logger = logger.
        With("environment", "dev").
        With("release", "v1.0.0")

    // log error
    logger.
        With("category", "sql").
        With("query.statement", "SELECT COUNT(*) FROM users;").
        With("query.duration", 1*time.Second).
        With("error", fmt.Errorf("could not count users")).
        Error("caramba!")

    // log user signup
    logger.
        With(
            slog.Group("user",
                slog.String("id", "user-123"),
                slog.Time("created_at", time.Now()),
            ),
        ).
        Info("user registration")
}

Tracing

Import the samber/slog-otel library.

import (
	slogzap "github.com/samber/slog-zap"
	slogotel "github.com/samber/slog-otel"
	"go.opentelemetry.io/otel/sdk/trace"
)

func main() {
	tp := trace.NewTracerProvider(
		trace.WithSampler(trace.AlwaysSample()),
	)
	tracer := tp.Tracer("hello/world")

	ctx, span := tracer.Start(context.Background(), "foo")
	defer span.End()

	span.AddEvent("bar")

	logger := slog.New(
		slogzap.Option{
			// ...
			AttrFromContext: []func(ctx context.Context) []slog.Attr{
				slogotel.ExtractOtelAttrFromContext([]string{"tracing"}, "trace_id", "span_id"),
			},
		}.NewZapHandler(),
	)

	logger.ErrorContext(ctx, "a message")
}

🀝 Contributing

Don't hesitate ;)

# Install some dev dependencies
make tools

# Run tests
make test
# or
make watch-test

πŸ‘€ Contributors

Contributors

πŸ’« Show your support

Give a ⭐️ if this project helped you!

GitHub Sponsors

πŸ“ License

Copyright Β© 2023 Samuel Berthe.

This project is MIT licensed.