diff options
| author | Kyren223 <Kyren223@proton.me> | 2025-07-03 20:46:29 +0300 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2025-07-03 20:46:29 +0300 |
| commit | 2d1408598ada38cb51412efe74b7c64466cb9057 (patch) | |
| tree | f87a4909ff3eb224d24e244f69cb07d44d00c099 /internal/server/ctxkeys/ctxkeys.go | |
| parent | 635db98044c4bdf1d9badc0e24ce2db461d83c75 (diff) | |
Added ctxkeys package to better handle addition context when logging and
partially integrated it with keys for user id and ip addr
Diffstat (limited to 'internal/server/ctxkeys/ctxkeys.go')
| -rw-r--r-- | internal/server/ctxkeys/ctxkeys.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/internal/server/ctxkeys/ctxkeys.go b/internal/server/ctxkeys/ctxkeys.go new file mode 100644 index 0000000..c0f688d --- /dev/null +++ b/internal/server/ctxkeys/ctxkeys.go @@ -0,0 +1,51 @@ +package ctxkeys + +import ( + "context" + "log/slog" + + "github.com/kyren223/eko/pkg/assert" +) + +type key int + +const ( + UserID key = iota + IpAddr + KeyMax +) + +var keyNames = map[key]string{ + UserID: "user_id", + IpAddr: "ip_addr", +} + +func Init() { + assert.Assert(len(keyNames) == int(KeyMax), "Keys in keyNames mismatch amount of keys", "len(keyNames)", len(keyNames), "KeyMax", int(KeyMax)) +} + +func WithValue(ctx context.Context, k key, v any) context.Context { + return context.WithValue(ctx, k, v) +} + +func Value(ctx context.Context, k key) any { + return ctx.Value(k) +} + +type ContextHandler struct { + slog.Handler +} + +func WrapLogHandler(baseHandler slog.Handler) *ContextHandler { + return &ContextHandler{Handler: baseHandler} +} + +func (h *ContextHandler) Handle(ctx context.Context, r slog.Record) error { + for k := key(0); k < KeyMax; k++ { + if v := Value(ctx, k); v != nil { + r.AddAttrs(slog.Any(keyNames[k], v)) + } + } + + return h.Handler.Handle(ctx, r) +} |
