Skip to content

Commit 5d88f52

Browse files
authored
funcr: Add LogInfoLevel Option to skip logging level in the info log (#240)
* funcr: Add LogInfoLevel Option to skip logging level in the info log Benchmark before: ``` goos: darwin goarch: arm64 pkg: github.com/go-logr/logr/benchmark BenchmarkDiscardLogInfoOneArg-10 58466427 21.36 ns/op 32 B/op 1 allocs/op BenchmarkDiscardLogInfoSeveralArgs-10 24470527 49.62 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogInfoWithValues-10 21938677 47.06 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogV0Info-10 24796845 47.45 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogV9Info-10 26069977 49.02 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogError-10 23731986 47.94 ns/op 176 B/op 2 allocs/op BenchmarkDiscardWithValues-10 50995291 22.28 ns/op 64 B/op 1 allocs/op BenchmarkDiscardWithName-10 1000000000 0.4716 ns/op 0 B/op 0 allocs/op BenchmarkFuncrLogInfoOneArg-10 2684097 433.9 ns/op 1152 B/op 7 allocs/op BenchmarkFuncrJSONLogInfoOneArg-10 2413437 480.4 ns/op 1168 B/op 8 allocs/op BenchmarkFuncrLogInfoSeveralArgs-10 1261210 953.2 ns/op 1448 B/op 17 allocs/op BenchmarkFuncrJSONLogInfoSeveralArgs-10 1000000 1003 ns/op 1448 B/op 18 allocs/op BenchmarkFuncrLogInfoWithValues-10 1247379 1027 ns/op 1480 B/op 17 allocs/op BenchmarkFuncrJSONLogInfoWithValues-10 1000000 1109 ns/op 1496 B/op 18 allocs/op BenchmarkFuncrLogV0Info-10 1000000 1043 ns/op 1448 B/op 17 allocs/op BenchmarkFuncrJSONLogV0Info-10 1000000 1100 ns/op 1448 B/op 18 allocs/op BenchmarkFuncrLogV9Info-10 24429925 48.76 ns/op 176 B/op 2 allocs/op BenchmarkFuncrJSONLogV9Info-10 24799878 53.82 ns/op 176 B/op 2 allocs/op BenchmarkFuncrLogError-10 1000000 1010 ns/op 1480 B/op 19 allocs/op BenchmarkFuncrJSONLogError-10 1000000 1124 ns/op 1496 B/op 20 allocs/op BenchmarkFuncrWithValues-10 4088592 296.0 ns/op 264 B/op 8 allocs/op BenchmarkFuncrWithName-10 34046577 32.95 ns/op 96 B/op 1 allocs/op BenchmarkFuncrWithCallDepth-10 34601535 32.77 ns/op 96 B/op 1 allocs/op BenchmarkFuncrJSONLogInfoStringerValue-10 2062101 562.0 ns/op 1200 B/op 10 allocs/op BenchmarkFuncrJSONLogInfoErrorValue-10 2278339 529.9 ns/op 1200 B/op 10 allocs/op BenchmarkFuncrJSONLogInfoMarshalerValue-10 2108040 533.6 ns/op 1200 B/op 10 allocs/op ``` Benchmark after: ``` goos: darwin goarch: arm64 pkg: github.com/go-logr/logr/benchmark BenchmarkDiscardLogInfoOneArg-10 59617632 20.01 ns/op 32 B/op 1 allocs/op BenchmarkDiscardLogInfoSeveralArgs-10 26171325 47.09 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogInfoWithValues-10 25975759 45.76 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogV0Info-10 25654935 46.02 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogV9Info-10 25722668 46.00 ns/op 176 B/op 2 allocs/op BenchmarkDiscardLogError-10 25181846 45.97 ns/op 176 B/op 2 allocs/op BenchmarkDiscardWithValues-10 53340940 21.92 ns/op 64 B/op 1 allocs/op BenchmarkDiscardWithName-10 1000000000 0.4757 ns/op 0 B/op 0 allocs/op BenchmarkFuncrLogInfoOneArg-10 2887884 416.5 ns/op 1152 B/op 7 allocs/op BenchmarkFuncrJSONLogInfoOneArg-10 2556847 474.0 ns/op 1168 B/op 8 allocs/op BenchmarkFuncrLogInfoSeveralArgs-10 1280838 957.4 ns/op 1448 B/op 17 allocs/op BenchmarkFuncrJSONLogInfoSeveralArgs-10 1000000 1003 ns/op 1448 B/op 18 allocs/op BenchmarkFuncrLogInfoWithValues-10 1241484 967.6 ns/op 1480 B/op 17 allocs/op BenchmarkFuncrJSONLogInfoWithValues-10 1000000 1021 ns/op 1496 B/op 18 allocs/op BenchmarkFuncrLogV0Info-10 1202900 925.3 ns/op 1448 B/op 17 allocs/op BenchmarkFuncrJSONLogV0Info-10 1000000 1021 ns/op 1448 B/op 18 allocs/op BenchmarkFuncrLogV9Info-10 24424683 48.45 ns/op 176 B/op 2 allocs/op BenchmarkFuncrJSONLogV9Info-10 24633237 48.23 ns/op 176 B/op 2 allocs/op BenchmarkFuncrLogError-10 1000000 1066 ns/op 1480 B/op 19 allocs/op BenchmarkFuncrJSONLogError-10 1072557 1093 ns/op 1496 B/op 20 allocs/op BenchmarkFuncrWithValues-10 4094355 292.9 ns/op 264 B/op 8 allocs/op BenchmarkFuncrWithName-10 36661557 33.96 ns/op 96 B/op 1 allocs/op BenchmarkFuncrWithCallDepth-10 32008606 32.65 ns/op 96 B/op 1 allocs/op BenchmarkFuncrJSONLogInfoStringerValue-10 2329975 517.9 ns/op 1200 B/op 10 allocs/op BenchmarkFuncrJSONLogInfoErrorValue-10 2200308 522.0 ns/op 1200 B/op 10 allocs/op BenchmarkFuncrJSONLogInfoMarshalerValue-10 2242267 536.0 ns/op 1200 B/op 10 allocs/op ``` The performance is similar. Only a nil pointer check is added in the main path. Signed-off-by: spacewander <[email protected]> * apply @thockin's suggestion Signed-off-by: spacewander <[email protected]> --------- Signed-off-by: spacewander <[email protected]>
1 parent 177005d commit 5d88f52

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

funcr/funcr.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ type Options struct {
100100
// details, see docs for Go's time.Layout.
101101
TimestampFormat string
102102

103+
// LogInfoLevel tells funcr what key to use to log the info level.
104+
// If not specified, the info level will be logged as "level".
105+
// If this is set to "", the info level will not be logged at all.
106+
LogInfoLevel *string
107+
103108
// Verbosity tells funcr which V logs to produce. Higher values enable
104109
// more logs. Info logs at or below this level will be written, while logs
105110
// above this level will be discarded.
@@ -213,6 +218,10 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter {
213218
if opts.MaxLogDepth == 0 {
214219
opts.MaxLogDepth = defaultMaxLogDepth
215220
}
221+
if opts.LogInfoLevel == nil {
222+
opts.LogInfoLevel = new(string)
223+
*opts.LogInfoLevel = "level"
224+
}
216225
f := Formatter{
217226
outputFormat: outfmt,
218227
prefix: "",
@@ -835,7 +844,10 @@ func (f Formatter) FormatInfo(level int, msg string, kvList []any) (prefix, args
835844
if policy := f.opts.LogCaller; policy == All || policy == Info {
836845
args = append(args, "caller", f.caller())
837846
}
838-
args = append(args, "level", level, "msg", msg)
847+
if key := *f.opts.LogInfoLevel; key != "" {
848+
args = append(args, key, level)
849+
}
850+
args = append(args, "msg", msg)
839851
return prefix, f.render(args, kvList)
840852
}
841853

funcr/funcr_test.go

+37
Original file line numberDiff line numberDiff line change
@@ -1361,3 +1361,40 @@ func TestOptionsTimestampFormat(t *testing.T) {
13611361
t.Errorf("\nexpected %q\n got %q", expect, capt.log)
13621362
}
13631363
}
1364+
1365+
func TestOptionsLogInfoLevel(t *testing.T) {
1366+
testCases := []struct {
1367+
name string
1368+
level *string
1369+
expect string
1370+
}{
1371+
{
1372+
name: "custom key",
1373+
level: ptrstr("info_level"),
1374+
expect: `"info_level"=0 "msg"="msg"`,
1375+
},
1376+
{
1377+
name: "no level",
1378+
level: ptrstr(""),
1379+
expect: `"msg"="msg"`,
1380+
},
1381+
{
1382+
name: "default",
1383+
level: nil,
1384+
expect: `"level"=0 "msg"="msg"`,
1385+
},
1386+
}
1387+
1388+
for _, tc := range testCases {
1389+
t.Run("Run: "+tc.name, func(t *testing.T) {
1390+
capt := &capture{}
1391+
sink := newSink(capt.Func, NewFormatter(Options{LogInfoLevel: tc.level}))
1392+
dSink, _ := sink.(logr.CallDepthLogSink)
1393+
sink = dSink.WithCallDepth(1)
1394+
sink.Info(0, "msg")
1395+
if capt.log != tc.expect {
1396+
t.Errorf("\nexpected %q\n got %q", tc.expect, capt.log)
1397+
}
1398+
})
1399+
}
1400+
}

0 commit comments

Comments
 (0)