From 8762a3b7ba4ce1a0e6e8149ec4b600d9326ab5a3 Mon Sep 17 00:00:00 2001 From: soasurs Date: Mon, 8 May 2023 17:16:44 +0800 Subject: [PATCH] fix: Errorv should generate JSON Object for content field in log (#3222) Signed-off-by: soasurs --- core/logx/richlogger.go | 2 +- core/logx/richlogger_test.go | 45 +++++++++++++++++++++++++++++++++--- core/logx/syslog_test.go | 2 ++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/core/logx/richlogger.go b/core/logx/richlogger.go index 6f2a826d..0357e397 100644 --- a/core/logx/richlogger.go +++ b/core/logx/richlogger.go @@ -65,7 +65,7 @@ func (l *richLogger) Errorf(format string, v ...any) { } func (l *richLogger) Errorv(v any) { - l.err(fmt.Sprint(v)) + l.err(v) } func (l *richLogger) Errorw(msg string, fields ...LogField) { diff --git a/core/logx/richlogger_test.go b/core/logx/richlogger_test.go index b629c537..11f7dfcb 100644 --- a/core/logx/richlogger_test.go +++ b/core/logx/richlogger_test.go @@ -66,6 +66,9 @@ func TestTraceDebug(t *testing.T) { l.WithDuration(time.Second).Debugv(testlog) validate(t, w.String(), true, true) w.Reset() + l.WithDuration(time.Second).Debugv(testobj) + validateContentType(t, w.String(), map[string]any{}, true, true) + w.Reset() l.WithDuration(time.Second).Debugw(testlog, Field("foo", "bar")) validate(t, w.String(), true, true) assert.True(t, strings.Contains(w.String(), "foo"), w.String()) @@ -103,6 +106,9 @@ func TestTraceError(t *testing.T) { l.WithDuration(time.Second).Errorv(testlog) validate(t, w.String(), true, true) w.Reset() + l.WithDuration(time.Second).Errorv(testobj) + validateContentType(t, w.String(), map[string]any{}, true, true) + w.Reset() l.WithDuration(time.Second).Errorw(testlog, Field("basket", "ball")) validate(t, w.String(), true, true) assert.True(t, strings.Contains(w.String(), "basket"), w.String()) @@ -137,6 +143,9 @@ func TestTraceInfo(t *testing.T) { l.WithDuration(time.Second).Infov(testlog) validate(t, w.String(), true, true) w.Reset() + l.WithDuration(time.Second).Infov(testobj) + validateContentType(t, w.String(), map[string]any{}, true, true) + w.Reset() l.WithDuration(time.Second).Infow(testlog, Field("basket", "ball")) validate(t, w.String(), true, true) assert.True(t, strings.Contains(w.String(), "basket"), w.String()) @@ -173,6 +182,9 @@ func TestTraceInfoConsole(t *testing.T) { w.Reset() l.WithDuration(time.Second).Infov(testlog) validate(t, w.String(), true, true) + w.Reset() + l.WithDuration(time.Second).Infov(testobj) + validateContentType(t, w.String(), map[string]any{}, true, true) } func TestTraceSlow(t *testing.T) { @@ -204,6 +216,9 @@ func TestTraceSlow(t *testing.T) { l.WithDuration(time.Second).Slowv(testlog) validate(t, w.String(), true, true) w.Reset() + l.WithDuration(time.Second).Slowv(testobj) + validateContentType(t, w.String(), map[string]any{}, true, true) + w.Reset() l.WithDuration(time.Second).Sloww(testlog, Field("basket", "ball")) validate(t, w.String(), true, true) assert.True(t, strings.Contains(w.String(), "basket"), w.String()) @@ -311,8 +326,32 @@ func validate(t *testing.T, body string, expectedTrace, expectedSpan bool) { assert.Equal(t, expectedSpan, len(val.Span) > 0, body) } +func validateContentType(t *testing.T, body string, expectedType any, expectedTrace, expectedSpan bool) { + var val mockValue + dec := json.NewDecoder(strings.NewReader(body)) + + for { + var doc mockValue + err := dec.Decode(&doc) + if err == io.EOF { + // all done + break + } + if err != nil { + continue + } + + val = doc + } + + assert.IsType(t, expectedType, val.Content, body) + assert.Equal(t, expectedTrace, len(val.Trace) > 0, body) + assert.Equal(t, expectedSpan, len(val.Span) > 0, body) +} + type mockValue struct { - Trace string `json:"trace"` - Span string `json:"span"` - Foo string `json:"foo"` + Trace string `json:"trace"` + Span string `json:"span"` + Foo string `json:"foo"` + Content any `json:"content"` } diff --git a/core/logx/syslog_test.go b/core/logx/syslog_test.go index 8591f16c..eb6d757a 100644 --- a/core/logx/syslog_test.go +++ b/core/logx/syslog_test.go @@ -12,6 +12,8 @@ import ( const testlog = "Stay hungry, stay foolish." +var testobj = map[string]any{"foo": "bar"} + func TestCollectSysLog(t *testing.T) { CollectSysLog() content := getContent(captureOutput(func() {