chore(slogutil): ensure quoting of empty and confusing log values (#10236)
Clearer parsing (also for humans)
This commit is contained in:
@@ -116,6 +116,7 @@ func expandAttrs(prefix string, a slog.Attr) []slog.Attr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func appendAttr(sb *strings.Builder, prefix string, a slog.Attr, attrCount *int) {
|
func appendAttr(sb *strings.Builder, prefix string, a slog.Attr, attrCount *int) {
|
||||||
|
const confusables = ` "()[]{},`
|
||||||
if a.Key == "" {
|
if a.Key == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -127,7 +128,7 @@ func appendAttr(sb *strings.Builder, prefix string, a slog.Attr, attrCount *int)
|
|||||||
sb.WriteString(a.Key)
|
sb.WriteString(a.Key)
|
||||||
sb.WriteRune('=')
|
sb.WriteRune('=')
|
||||||
v := a.Value.Resolve().String()
|
v := a.Value.Resolve().String()
|
||||||
if strings.ContainsAny(v, ` "()`) {
|
if v == "" || strings.ContainsAny(v, confusables) {
|
||||||
v = strconv.Quote(v)
|
v = strconv.Quote(v)
|
||||||
}
|
}
|
||||||
sb.WriteString(v)
|
sb.WriteString(v)
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ func TestFormattingHandler(t *testing.T) {
|
|||||||
l := slog.New(h).With("a", "a")
|
l := slog.New(h).With("a", "a")
|
||||||
l.Info("A basic info line", "attr1", "val with spaces", "attr2", 2, "attr3", `val"quote`)
|
l.Info("A basic info line", "attr1", "val with spaces", "attr2", 2, "attr3", `val"quote`)
|
||||||
l.Info("A basic info line", "attr1", "paren)thesis")
|
l.Info("A basic info line", "attr1", "paren)thesis")
|
||||||
|
l.Info("An info line with an empty value", "attr1", "")
|
||||||
l.Info("An info line with grouped values", "attr1", "val1", slog.Group("foo", "attr2", 2, slog.Group("bar", "attr3", "3")))
|
l.Info("An info line with grouped values", "attr1", "val1", slog.Group("foo", "attr2", 2, slog.Group("bar", "attr3", "3")))
|
||||||
|
|
||||||
l2 := l.WithGroup("foo")
|
l2 := l.WithGroup("foo")
|
||||||
@@ -39,6 +40,7 @@ func TestFormattingHandler(t *testing.T) {
|
|||||||
exp := `
|
exp := `
|
||||||
2009-02-13 23:31:30 INF A basic info line (attr1="val with spaces" attr2=2 attr3="val\"quote" a=a log.pkg=slogutil)
|
2009-02-13 23:31:30 INF A basic info line (attr1="val with spaces" attr2=2 attr3="val\"quote" a=a log.pkg=slogutil)
|
||||||
2009-02-13 23:31:30 INF A basic info line (attr1="paren)thesis" a=a log.pkg=slogutil)
|
2009-02-13 23:31:30 INF A basic info line (attr1="paren)thesis" a=a log.pkg=slogutil)
|
||||||
|
2009-02-13 23:31:30 INF An info line with an empty value (attr1="" a=a log.pkg=slogutil)
|
||||||
2009-02-13 23:31:30 INF An info line with grouped values (attr1=val1 foo.attr2=2 foo.bar.attr3=3 a=a log.pkg=slogutil)
|
2009-02-13 23:31:30 INF An info line with grouped values (attr1=val1 foo.attr2=2 foo.bar.attr3=3 a=a log.pkg=slogutil)
|
||||||
2009-02-13 23:31:30 INF An info line with grouped values via logger (foo.attr1=val1 foo.attr2=2 a=a log.pkg=slogutil)
|
2009-02-13 23:31:30 INF An info line with grouped values via logger (foo.attr1=val1 foo.attr2=2 a=a log.pkg=slogutil)
|
||||||
2009-02-13 23:31:30 INF An info line with nested grouped values via logger (bar.foo.attr1=val1 bar.foo.attr2=2 a=a log.pkg=slogutil)
|
2009-02-13 23:31:30 INF An info line with nested grouped values via logger (bar.foo.attr1=val1 bar.foo.attr2=2 a=a log.pkg=slogutil)
|
||||||
|
|||||||
Reference in New Issue
Block a user