mirror of
https://github.com/golang/go
synced 2024-11-21 17:14:45 -07:00
log/slog: Add WithAttrs and Logger.WithAttrs
This merge request introduces the WithAttrs function to the log/slog package, enabling efficient attribute-based logging of structured data. Updates #66937
This commit is contained in:
parent
7f76c00fc5
commit
edbcc9af88
@ -133,6 +133,16 @@ func (l *Logger) With(args ...any) *Logger {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithAttrs is a more efficient version of [Logger.With] that accepts only Attrs.
|
||||||
|
func (l *Logger) WithAttrs(attrs ...Attr) *Logger {
|
||||||
|
if len(attrs) == 0 {
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
c := l.clone()
|
||||||
|
c.handler = l.handler.WithAttrs(attrs)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
// WithGroup returns a Logger that starts a group, if name is non-empty.
|
// WithGroup returns a Logger that starts a group, if name is non-empty.
|
||||||
// The keys of all attributes added to the Logger will be qualified by the given
|
// The keys of all attributes added to the Logger will be qualified by the given
|
||||||
// name. (How that qualification happens depends on the [Handler.WithGroup]
|
// name. (How that qualification happens depends on the [Handler.WithGroup]
|
||||||
@ -161,6 +171,11 @@ func With(args ...any) *Logger {
|
|||||||
return Default().With(args...)
|
return Default().With(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithAttrs calls [Logger.WithAttrs] on the default logger.
|
||||||
|
func WithAttrs(attrs ...Attr) *Logger {
|
||||||
|
return Default().WithAttrs(attrs...)
|
||||||
|
}
|
||||||
|
|
||||||
// Enabled reports whether l emits log records at the given context and level.
|
// Enabled reports whether l emits log records at the given context and level.
|
||||||
func (l *Logger) Enabled(ctx context.Context, level Level) bool {
|
func (l *Logger) Enabled(ctx context.Context, level Level) bool {
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
|
@ -167,10 +167,11 @@ func TestAttrs(t *testing.T) {
|
|||||||
|
|
||||||
l1 := New(&captureHandler{}).With("a", 1)
|
l1 := New(&captureHandler{}).With("a", 1)
|
||||||
l2 := New(l1.Handler()).With("b", 2)
|
l2 := New(l1.Handler()).With("b", 2)
|
||||||
l2.Info("m", "c", 3)
|
l3 := New(l2.Handler()).WithAttrs(Int("c", 3))
|
||||||
h := l2.Handler().(*captureHandler)
|
l3.Info("m", "d", 4)
|
||||||
check(h.attrs, Int("a", 1), Int("b", 2))
|
h := l3.Handler().(*captureHandler)
|
||||||
check(attrsSlice(h.r), Int("c", 3))
|
check(h.attrs, Int("a", 1), Int("b", 2), Int("c", 3))
|
||||||
|
check(attrsSlice(h.r), Int("d", 4))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCallDepth(t *testing.T) {
|
func TestCallDepth(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user