Skip to content

Commit 138ec62

Browse files
committed
feat: call to ensure logger in context
1 parent e3b7283 commit 138ec62

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

logctx/context.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ func WithLogger(ctx context.Context, logger suplog.Logger) context.Context {
2323
})
2424
}
2525

26+
// EnsureLogger sets the logger in the context only if it doesn't already exist.
27+
// It's recommended to use this in middleware to avoid overwriting existing loggers.
28+
func EnsureLogger(ctx context.Context, logger suplog.Logger) context.Context {
29+
if _, ok := fromContext(ctx); ok {
30+
return ctx
31+
}
32+
return WithLogger(ctx, logger)
33+
}
34+
2635
// WithErr adds an error field to the logger in the context (thread-safe).
2736
func WithErr(ctx context.Context, err error) context.Context {
2837
l, ok := fromContext(ctx)

logctx/context_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,19 @@ func TestContextLogHelpers(t *testing.T) {
139139
require.Contains(t, lines[1], `msg="debug downgraded 2"`)
140140
})
141141
}
142+
143+
func TestEnsureLogger(t *testing.T) {
144+
var recorder strings.Builder
145+
logger := log.NewLogger(&recorder, new(log.TextFormatter))
146+
ctx := context.Background()
147+
148+
// Should set the logger since none exists
149+
ctxWithLogger := EnsureLogger(ctx, logger)
150+
require.NotNil(t, Logger(ctxWithLogger))
151+
require.Equal(t, logger, Logger(ctxWithLogger))
152+
153+
// Should NOT overwrite existing logger
154+
anotherLogger := log.NewLogger(&strings.Builder{}, new(log.TextFormatter))
155+
ctxWithLogger2 := EnsureLogger(ctxWithLogger, anotherLogger)
156+
require.Equal(t, logger, Logger(ctxWithLogger2))
157+
}

0 commit comments

Comments
 (0)