log/slog: Group takes ...any

The Group function takes a key and a ...any, which is converted
into attrs.

Fixes #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>
This commit is contained in:
Jonathan Amsterdam 2023-04-19 14:56:58 -04:00
parent 79723f389b
commit 2f5f231ac1
5 changed files with 22 additions and 18 deletions

View file

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

1
api/next/59204.txt Normal file
View file

@ -0,0 +1 @@
pkg log/slog, func Group(string, ...interface{}) Attr #59204

View file

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

View file

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

View file

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