slogzerolog

package module
v2.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 25, 2026 License: MIT Imports: 5 Imported by: 51

README

slog: Zerolog handler

tag Go Version GoDoc Build Status Go report Coverage Contributors License

A Zerolog Handler for slog Go library.

See also:

HTTP middlewares:

Loggers:

Log sinks:

🚀 Install

go get github.com/samber/slog-zerolog/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-zerolog/v2

Handler options
type Option struct {
    // log level (default: debug)
	// you can use ZeroLogLeveler to retrieve the level from the global zerolog instance or a custom one
    Level slog.Leveler

    // optional: zerolog logger (default: zerolog.Logger)
    Logger *zerolog.Logger
    // optional: don't add timestamp to record
    NoTimestamp bool

    // 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:

slogzerolog.SourceKey = "source"
slogzerolog.ErrorKeys = []string{"error", "err"}
slogzerolog.LogLevels = map[slog.Level]zerolog.Level{...}
Example
import (
    "github.com/rs/zerolog"
    slogzerolog "github.com/samber/slog-zerolog/v2"
    "os"
    "log/slog"
)

func main() {
    zerologLogger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr})

    logger := slog.New(slogzerolog.Option{Level: slog.LevelDebug, Logger: &zerologLogger}.NewZerologHandler())
    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 (
	slogzerolog "github.com/samber/slog-zerolog"
	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(
		slogzerolog.Option{
			// ...
			AttrFromContext: []func(ctx context.Context) []slog.Attr{
				slogotel.ExtractOtelAttrFromContext([]string{"tracing"}, "trace_id", "span_id"),
			},
		}.NewZerologHandler(),
	)

	logger.ErrorContext(ctx, "a message")
}
Zerolog level mapping

Use the slogzerolog.ZeroLogLeveler as slogzerolog.Option.Level (slog.Leveler) to set the slog.Level from zerolog.Level.

Currently following levels are mapped:

zerolog slog
Trace-N Debug-1-N
Trace Debug-1
Debug Debug
Info Info
Warn Warn
Error Error
Panic Error
Fatal Error
NoLevel Info
Disabled Debug-1
* Info
import (
    "github.com/rs/zerolog"
    slogzerolog "github.com/samber/slog-zerolog/v2"
    "os"
    "log/slog"
)

func main() {
    zerologLogger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr})

    logger := slog.New(slogzerolog.Option{Level: ZeroLogLeveler{&zerologLogger}, Logger: &zerologLogger}.NewZerologHandler())

    logger.Trace("caramba!")
}

🤝 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.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrorKeys = []string{"error", "err"}
View Source
var SourceKey = "source"

Functions

func DefaultConverter

func DefaultConverter(addSource bool, replaceAttr func(groups []string, a slog.Attr) slog.Attr, loggerAttr []slog.Attr, groups []string, record *slog.Record) map[string]any

Types

type Converter

type Converter func(addSource bool, replaceAttr func(groups []string, a slog.Attr) slog.Attr, loggerAttr []slog.Attr, groups []string, record *slog.Record) map[string]any

type Option

type Option struct {
	// log level (default: debug)
	// you can use ZeroLogLeveler to retrieve the level from the global zerolog instance or a custom one
	Level slog.Leveler

	// optional: zerolog logger (default: zerolog.Logger)
	Logger *zerolog.Logger
	// optional: don't add timestamp to record
	NoTimestamp bool

	// 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
}

func (Option) NewZerologHandler

func (o Option) NewZerologHandler() slog.Handler

type ZeroLogLeveler added in v2.8.0

type ZeroLogLeveler struct {
	// optional: zerolog logger (default: log.Logger)
	Logger *zerolog.Logger
}

ZeroLogLeveler can be used for Option.Level (implements slog.Leveler). If no Logger is provided, the global zerolog.Logger is used.

func (ZeroLogLeveler) Level added in v2.8.0

func (z ZeroLogLeveler) Level() slog.Level

type ZerologHandler

type ZerologHandler struct {
	// contains filtered or unexported fields
}

func (*ZerologHandler) Enabled

func (h *ZerologHandler) Enabled(_ context.Context, level slog.Level) bool

func (*ZerologHandler) Handle

func (h *ZerologHandler) Handle(ctx context.Context, record slog.Record) error

func (*ZerologHandler) WithAttrs

func (h *ZerologHandler) WithAttrs(attrs []slog.Attr) slog.Handler

func (*ZerologHandler) WithGroup

func (h *ZerologHandler) WithGroup(name string) slog.Handler

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL