Skip to content

Commit

Permalink
log/slog: Group takes ...any
Browse files Browse the repository at this point in the history
The Group function takes a key and a ...any, which is converted
into attrs.

Fixes golang#59204.

Change-Id: Ib714365dcda2eda37863ce433f3dd8cf5eeda610
Reviewed-on: https://go-review.googlesource.com/c/go/+/487855
Reviewed-by: Alan Donovan <adonovan@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
  • Loading branch information
jba authored and eric committed Sep 7, 2023
1 parent 36604ef commit f54bf65
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 18 deletions.
1 change: 0 additions & 1 deletion api/next/56345.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ pkg log/slog, func Error(string, ...interface{}) #56345
pkg log/slog, func ErrorCtx(context.Context, string, ...interface{}) #56345
pkg log/slog, func Float64(string, float64) Attr #56345
pkg log/slog, func Float64Value(float64) Value #56345
pkg log/slog, func Group(string, ...Attr) Attr #56345
pkg log/slog, func GroupValue(...Attr) Value #56345
pkg log/slog, func Info(string, ...interface{}) #56345
pkg log/slog, func InfoCtx(context.Context, string, ...interface{}) #56345
Expand Down
1 change: 1 addition & 0 deletions api/next/59204.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pkg log/slog, func Group(string, ...interface{}) Attr #59204
22 changes: 17 additions & 5 deletions src/log/slog/attr.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,26 @@ func Duration(key string, v time.Duration) Attr {
}

// Group returns an Attr for a Group Value.
// The caller must not subsequently mutate the
// argument slice.
// The first argument is the key; the remaining arguments
// are converted to Attrs as in [Logger.Log].
//
// Use Group to collect several Attrs under a single
// Use Group to collect several key-value pairs under a single
// key on a log line, or as the result of LogValue
// in order to log a single value as multiple Attrs.
func Group(key string, as ...Attr) Attr {
return Attr{key, GroupValue(as...)}
func Group(key string, args ...any) Attr {
return Attr{key, GroupValue(argsToAttrSlice(args)...)}
}

func argsToAttrSlice(args []any) []Attr {
var (
attr Attr
attrs []Attr
)
for len(args) > 0 {
attr, args = argsToAttr(args)
attrs = append(attrs, attr)
}
return attrs
}

// Any returns an Attr for the supplied value.
Expand Down
6 changes: 3 additions & 3 deletions src/log/slog/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,11 @@ How this qualification is displayed depends on the handler.
[TextHandler] separates the group and attribute names with a dot.
[JSONHandler] treats each group as a separate JSON object, with the group name as the key.
Use [Group] to create a Group Attr from a name and a list of Attrs:
Use [Group] to create a Group Attr from a name and a list of key-value pairs:
slog.Group("request",
slog.String("method", r.Method),
slog.Any("url", r.URL))
"method", r.Method,
"url", r.URL)
TextHandler would display this group as
Expand Down
10 changes: 1 addition & 9 deletions src/log/slog/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,8 @@ func (l *Logger) Handler() Handler { return l.handler }
// The new Logger's handler is the result of calling WithAttrs on the receiver's
// handler.
func (l *Logger) With(args ...any) *Logger {
var (
attr Attr
attrs []Attr
)
for len(args) > 0 {
attr, args = argsToAttr(args)
attrs = append(attrs, attr)
}
c := l.clone()
c.handler = l.handler.WithAttrs(attrs)
c.handler = l.handler.WithAttrs(argsToAttrSlice(args))
return c
}

Expand Down

0 comments on commit f54bf65

Please sign in to comment.