Dark Mode

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

samber/slog-quickwit

Repository files navigation

slog: Quickwit handler

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

Show your support

Give a if this project helped you!

License

Copyright (c) 2024 Samuel Berthe.

This project is MIT licensed.