Skip to content

Commit fbe4576

Browse files
committed
Format objects more nicely
1 parent 677a5ae commit fbe4576

File tree

11 files changed

+72
-11
lines changed

11 files changed

+72
-11
lines changed

internal/entryhuman/entry.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ package entryhuman
44

55
import (
66
"bytes"
7+
"encoding/json"
78
"fmt"
89
"io"
910
"os"
11+
"reflect"
1012
"strconv"
1113
"strings"
1214
"time"
@@ -54,6 +56,26 @@ func reset(w io.Writer, termW io.Writer) {
5456
}
5557
}
5658

59+
func formatValue(v interface{}) string {
60+
typ := reflect.TypeOf(v)
61+
switch typ.Kind() {
62+
case reflect.Struct, reflect.Map:
63+
byt, err := json.Marshal(v)
64+
if err != nil {
65+
panic(err)
66+
}
67+
return string(byt)
68+
case reflect.Slice:
69+
// Byte slices are optimistically readable.
70+
if typ.Elem().Kind() == reflect.Uint8 {
71+
return fmt.Sprintf("%q", v)
72+
}
73+
fallthrough
74+
default:
75+
return quote(fmt.Sprintf("%+v", v))
76+
}
77+
}
78+
5779
const tab = " "
5880

5981
// Fmt returns a human readable format for ent.
@@ -139,8 +161,8 @@ func Fmt(
139161
}
140162
buf.WriteString(render(termW, keyStyle, quoteKey(f.Name)))
141163
buf.WriteString(render(termW, equalsStyle, "="))
142-
valueStr := fmt.Sprintf("%+v", f.Value)
143-
buf.WriteString(quote(valueStr))
164+
valueStr := formatValue(f.Value)
165+
buf.WriteString(valueStr)
144166
}
145167

146168
if multilineVal != "" {

internal/entryhuman/entry_test.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"flag"
66
"fmt"
77
"io"
8-
"io/ioutil"
98
"os"
109
"testing"
1110
"time"
@@ -19,6 +18,12 @@ var kt = time.Date(2000, time.February, 5, 4, 4, 4, 4, time.UTC)
1918

2019
var updateGoldenFiles = flag.Bool("update-golden-files", false, "update golden files in testdata")
2120

21+
type testObj struct {
22+
foo int
23+
bar int
24+
dra []byte
25+
}
26+
2227
func TestEntry(t *testing.T) {
2328
t.Parallel()
2429

@@ -81,6 +86,38 @@ func TestEntry(t *testing.T) {
8186
),
8287
},
8388
},
89+
{
90+
"bytes",
91+
slog.SinkEntry{
92+
Level: slog.LevelWarn,
93+
Fields: slog.M(
94+
slog.F("somefile", []byte("blah bla\x01h blah")),
95+
),
96+
},
97+
},
98+
{
99+
"object",
100+
slog.SinkEntry{
101+
Level: slog.LevelWarn,
102+
Fields: slog.M(
103+
slog.F("obj", slog.M(
104+
slog.F("obj1", testObj{
105+
foo: 1,
106+
bar: 2,
107+
dra: []byte("blah"),
108+
}),
109+
slog.F("obj2", testObj{
110+
foo: 3,
111+
bar: 4,
112+
dra: []byte("blah"),
113+
}),
114+
)),
115+
slog.F("map", map[string]string{
116+
"key1": "value1",
117+
}),
118+
),
119+
},
120+
},
84121
}
85122
if *updateGoldenFiles {
86123
ents, err := os.ReadDir("testdata")
@@ -99,7 +136,7 @@ func TestEntry(t *testing.T) {
99136
goldenPath := fmt.Sprintf("testdata/%s.golden", tc.name)
100137

101138
var gotBuf bytes.Buffer
102-
entryhuman.Fmt(&gotBuf, ioutil.Discard, tc.ent)
139+
entryhuman.Fmt(&gotBuf, io.Discard, tc.ent)
103140

104141
if *updateGoldenFiles {
105142
err := os.WriteFile(goldenPath, gotBuf.Bytes(), 0o644)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0001-01-01 00:00:00.000 [warn] somefile="blah bla\x01h blah"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0001-01-01 00:00:00.000 [warn] funky^%&^&^key=value funky^%&^&^key2="@#\t \t \n"
1+
0001-01-01 00:00:00.000 [warn] funky^%&^&^key=value funky^%&^&^key2="@#\t \t \n"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
0001-01-01 00:00:00.000 [info] msg ...
1+
0001-01-01 00:00:00.000 [info] msg ...
22
field= line1
33
line2
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
0001-01-01 00:00:00.000 [info] ...
1+
0001-01-01 00:00:00.000 [info] ...
22
msg= line1
33
line2
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0001-01-01 00:00:00.000 [warn] (named.meow)
1+
0001-01-01 00:00:00.000 [warn] (named.meow)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0001-01-01 00:00:00.000 [warn] obj="[{Name:obj1 Value:{foo:1 bar:2 dra:[98 108 97 104]}} {Name:obj2 Value:{foo:3 bar:4 dra:[98 108 97 104]}}]" map={"key1":"value1"}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2000-02-05 04:04:04.000 [debu] wowowow izi
1+
2000-02-05 04:04:04.000 [debu] wowowow izi
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0001-01-01 00:00:00.000 [warn] space_in_my_key="value in my value"
1+
0001-01-01 00:00:00.000 [warn] space_in_my_key="value in my value"

s_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@ func TestStdlib(t *testing.T) {
2323
et, rest, err := entryhuman.StripTimestamp(b.String())
2424
assert.Success(t, "strip timestamp", err)
2525
assert.False(t, "timestamp", et.IsZero())
26-
assert.Equal(t, "entry", " [info]\t(stdlib)\tstdlib\thi=we\n", rest)
26+
assert.Equal(t, "entry", " [info] (stdlib) stdlib hi=we\n", rest)
2727
}

0 commit comments

Comments
 (0)