Skip to content

samber/slog-quickwit

Folders and files

NameName
Last commit message
Last commit date
Nov 18, 2024
Jun 4, 2024
May 1, 2024
May 1, 2024
May 1, 2024
Sep 9, 2024
Jul 1, 2024
May 1, 2024
Jan 12, 2025
Jan 12, 2025
Jul 10, 2024
May 1, 2024
May 1, 2024
May 1, 2024
May 1, 2024

Repository files navigation

slog: Quickwit handler

tag Go Version GoDoc Build Status Go report Coverage Contributors License

A Quickwit Handler for slog Go library.

See also:

HTTP middlewares:

Loggers:

Log sinks:

πŸš€ Install

go get github.com/samber/slog-quickwit

Compatibility: go >= 1.21

This library is v0 and follows SemVer strictly. Some breaking changes might be made to exported APIs before v1.0.0.

πŸ’‘ Usage

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

Handler options

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

    // Quickwit client
    Client *quickwit.Client

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

Attributes will be injected in log payload.

Other global parameters:

slogquickwit.SourceKey = "source"
slogquickwit.ContextKey = "context"
slogquickwit.ErrorKeys = []string{"error", "err"}

Example

import (
    "github.com/samber/go-quickwit"
    slogquickwit "github.com/samber/slog-slogquickwit"
    "log/slog"
)

func main() {
    // docker-compose up -d
    // curl -X POST \
    //     'http://localhost:7280/api/v1/indexes' \
    //     -H 'Content-Type: application/yaml' \
    //     --data-binary @test-config.yaml

    client := quickwit.NewWithDefault("http://localhost:7280", "my-index")
    defer client.Stop() // flush and stop

    logger := slog.New(slogquickwit.Option{Level: slog.LevelDebug, Client: client}.NewQuickwitHandler())
    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 (
	slogquickwit "github.com/samber/slog-quickwit"
	slogotel "github.com/samber/slog-otel"
	"go.opentelemetry.io/otel/sdk/trace"
)

func main() {
    client := quickwit.NewWithDefault("http://localhost:7280", "my-index")
    defer client.Stop() // flush and stop

	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(
		slogquickwit.Option{
			// ...
			AttrFromContext: []func(ctx context.Context) []slog.Attr{
				slogotel.ExtractOtelAttrFromContext([]string{"tracing"}, "trace_id", "span_id"),
			},
		}.NewQuickwitHandler(),
	)

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

🀝 Contributing

Don't hesitate ;)

# Start quickwit
docker-compose up -d
curl -X POST \
    'http://localhost:7280/api/v1/indexes' \
    -H 'Content-Type: application/yaml' \
    --data-binary @test-config.yaml

# 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 Β© 2024 Samuel Berthe.

This project is MIT licensed.