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