context.go

v0.2.0
Doc Versions Source
1
package logutil
2
3
import (
4
	"context"
5
	"log/slog"
6
)
7
8
type loggerKey struct{}
9
10
func FromContext(ctx context.Context) *slog.Logger {
11
	if l, ok := ctx.Value(loggerKey{}).(*slog.Logger); ok {
12
		return l
13
	}
14
	return slog.Default()
15
}
16
17
func WithLogger(ctx context.Context, l *slog.Logger) context.Context {
18
	return context.WithValue(ctx, loggerKey{}, l)
19
}
20
21
func WithField(ctx context.Context, key string, value any) (context.Context, *slog.Logger) {
22
	l := FromContext(ctx).With(key, value)
23
	return context.WithValue(ctx, loggerKey{}, l), l
24
}
25
26
func WithFields(ctx context.Context, fields map[string]any) (context.Context, *slog.Logger) {
27
	args := make([]any, 0, len(fields)*2)
28
	for k, v := range fields {
29
		args = append(args, k, v)
30
	}
31
	l := FromContext(ctx).With(args...)
32
	return context.WithValue(ctx, loggerKey{}, l), l
33
}
34

Source Files