Skip to content

Commit dbbf7a2

Browse files
committed
[logger] rework logger name, stacktrace and error passthrough
- Finalize logger documentation. - Add stacktrace capture. - Change the way name and error being passed to adapter. Since many backends lacks, for example, named loggers - consistent way is to pass these parameters as fields, rather handle them special way per adapter. Though, adapters still able to handle these fields if needed, manually processing fields and extracting required fields. Change-Id: I083ba13131f87773ec6cff4cf1f12a4f598b92a5
1 parent ac007a8 commit dbbf7a2

14 files changed

Lines changed: 1059 additions & 121 deletions

File tree

e/log_test.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func TestLog(t *testing.T) {
1717
t.Parallel()
1818

1919
adapter, buff := bufferadapter.New()
20-
log := logger.New(adapter, logger.DefaultLogLevel)
20+
log := logger.New(adapter, logger.WithLevel(logger.LevelTrace))
2121

2222
e1 := errors.New("e1") //nolint:err113
2323
e2 := fmt.Errorf("e2: %w", e1)
@@ -35,31 +35,26 @@ func TestLog(t *testing.T) {
3535
{
3636
Level: logger.LevelError,
3737
Msg: e1.Error(),
38-
Error: nil,
3938
Fields: nil,
4039
},
4140
{
4241
Level: logger.LevelWarning,
4342
Msg: e1.Error(),
44-
Error: nil,
4543
Fields: nil,
4644
},
4745
{
4846
Level: logger.LevelInfo,
4947
Msg: e2.Error(),
50-
Error: nil,
5148
Fields: nil,
5249
},
5350
{
5451
Level: logger.LevelDebug,
5552
Msg: e3.Reason(),
56-
Error: e1,
57-
Fields: e3.Fields(),
53+
Fields: fields.List{fields.F("foo", "bar"), fields.F("error", "e1")},
5854
},
5955
{
6056
Level: logger.LevelTrace,
6157
Msg: e4.Reason(),
62-
Error: nil,
6358
Fields: nil,
6459
},
6560
}, buff.GetAll())

logger/adapter.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,15 @@ import (
1313
//
1414
// For examples of adapter implementations, see the adapters subpackages.
1515
type Adapter interface {
16-
// Log logs a message with the provided level, message, optional error, and
17-
// additional fields. The level parameter is one of the logger level constants
18-
// (LevelError, LevelWarning, LevelInfo, LevelDebug, LevelTrace) or a custom
19-
// level value.
16+
// Log logs a message with the provided level, message, and fields.
2017
//
21-
// The err parameter may be nil if no error is associated with the log message.
22-
// Adapters should handle nil errors gracefully.
18+
// The level parameter is one of the logger level constants (LevelError,
19+
// LevelWarning, LevelInfo, LevelDebug, LevelTrace) or a custom level value.
2320
//
2421
// The fs parameter contains zero or more fields that should be attached to the
2522
// log entry. This may include both fields from WithFields calls and fields
2623
// passed directly to the Log call.
27-
Log(level int, msg string, err error, fs ...fields.Field)
24+
Log(level int, msg string, fs ...fields.Field)
2825

2926
// WithFields returns a new adapter instance with the given fields attached.
3027
// The returned adapter should include these fields in all subsequent Log calls.

logger/bufferadapter/adapter.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
type LogEntry struct {
1212
Level int
1313
Msg string
14-
Error error `exhaustruct:"optional"`
1514
Fields fields.List `exhaustruct:"optional"`
1615
}
1716

@@ -77,11 +76,10 @@ func New() (*Adapter, *LogEntries) {
7776
return &Adapter{buff: buff}, buff
7877
}
7978

80-
func (a *Adapter) Log(level int, msg string, err error, fs ...fields.Field) {
79+
func (a *Adapter) Log(level int, msg string, fs ...fields.Field) {
8180
e := LogEntry{
8281
Level: level,
8382
Msg: msg,
84-
Error: err,
8583
Fields: append(slices.Clone(a.fs), fs...),
8684
}
8785

logger/bufferadapter/adapter_test.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func Test_New(t *testing.T) {
1818
require.NotNil(t, adapter)
1919
require.NotNil(t, buff)
2020

21-
adapter.Log(42, "test", nil)
21+
adapter.Log(42, "test")
2222
require.Equal(t, 1, buff.Len())
2323
assert.Equal(t, "test", buff.Get(0).Msg)
2424
}
@@ -31,21 +31,20 @@ func TestAdapter(t *testing.T) {
3131

3232
adapter, buff := bufferadapter.New()
3333

34-
adapter.Log(42, "foo", nil)
34+
adapter.Log(42, "foo")
3535
require.Equal(t, 1, buff.Len())
3636
assert.Equal(t, bufferadapter.LogEntry{
3737
Level: 42,
3838
Msg: "foo",
3939
}, buff.Get(0))
4040

4141
err := e.New("some error")
42-
adapter.Log(42, "foo", err, fields.F("foo", "bar"))
42+
adapter.Log(42, "foo", fields.F("error", err), fields.F("foo", "bar"))
4343
require.Equal(t, 2, buff.Len())
4444
assert.Equal(t, bufferadapter.LogEntry{
4545
Level: 42,
4646
Msg: "foo",
47-
Error: err,
48-
Fields: fields.List{fields.F("foo", "bar")},
47+
Fields: fields.List{fields.F("error", err), fields.F("foo", "bar")},
4948
}, buff.Get(1))
5049

5150
buff.Reset()
@@ -60,15 +59,15 @@ func TestAdapter(t *testing.T) {
6059

6160
require.NotSame(t, adapterSrc, adapter)
6261

63-
adapter.Log(42, "foo", nil)
62+
adapter.Log(42, "foo")
6463
require.Equal(t, 1, buff.Len())
6564
assert.Equal(t, bufferadapter.LogEntry{
6665
Level: 42,
6766
Msg: "foo",
6867
Fields: fields.List{fields.F("foo", "bar")},
6968
}, buff.Get(0))
7069

71-
adapter.Log(42, "foo", nil, fields.F("baz", "qux"))
70+
adapter.Log(42, "foo", fields.F("baz", "qux"))
7271
require.Equal(t, 2, buff.Len())
7372
assert.Equal(t, bufferadapter.LogEntry{
7473
Level: 42,
@@ -86,9 +85,9 @@ func TestLogEntries(t *testing.T) {
8685

8786
adapter, buff := bufferadapter.New()
8887

89-
adapter.Log(10, "first", nil)
90-
adapter.Log(20, "second", nil)
91-
adapter.Log(30, "third", nil)
88+
adapter.Log(10, "first")
89+
adapter.Log(20, "second")
90+
adapter.Log(30, "third")
9291

9392
entries := buff.GetAll()
9493
require.Len(t, entries, 3)
@@ -113,7 +112,7 @@ func TestLogEntries(t *testing.T) {
113112
adapter, buff := bufferadapter.New()
114113

115114
for i := range 10 {
116-
adapter.Log(i, "test", nil)
115+
adapter.Log(i, "test")
117116
}
118117

119118
require.Equal(t, 10, buff.Len())

logger/ctx_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package logger_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
10+
"dev.gaijin.team/go/golib/logger"
11+
"dev.gaijin.team/go/golib/logger/bufferadapter"
12+
)
13+
14+
func TestToAndFromCtx(t *testing.T) {
15+
t.Parallel()
16+
17+
adapter, _ := bufferadapter.New()
18+
lgr := logger.New(adapter)
19+
20+
ctxEmpty := context.Background()
21+
ctxLogger := logger.ToCtx(ctxEmpty, lgr)
22+
23+
require.NotEqual(t, ctxLogger, ctxEmpty, "ToCtx creates a new context")
24+
25+
{
26+
lgrCtx, ok := logger.FromCtx(ctxEmpty)
27+
assert.False(t, ok, "should return false for empty context")
28+
assert.True(t, lgrCtx.IsZero(), "should return zero-value logger for empty context")
29+
}
30+
31+
{
32+
lgrCtx, ok := logger.FromCtx(ctxLogger)
33+
assert.True(t, ok, "should return true for context with logger")
34+
assert.False(t, lgrCtx.IsZero(), "should not return zero-value logger for context with logger")
35+
assert.Equal(t, lgr, lgrCtx, "should return same logger as stored in context")
36+
}
37+
}
38+
39+
func TestFromCtxOrNop(t *testing.T) {
40+
t.Parallel()
41+
42+
adapter, _ := bufferadapter.New()
43+
lgr := logger.New(adapter)
44+
45+
ctxEmpty := context.Background()
46+
ctxLogger := logger.ToCtx(ctxEmpty, lgr)
47+
48+
{
49+
lgrCtx := logger.FromCtxOrNop(ctxEmpty)
50+
assert.True(t, lgrCtx.IsNop(), "should return nop logger for empty context")
51+
}
52+
53+
{
54+
lgrCtx := logger.FromCtxOrNop(ctxLogger)
55+
assert.False(t, lgrCtx.IsNop(), "should not return nop logger for context with logger")
56+
assert.Equal(t, lgr, lgrCtx, "should return same logger as stored in context")
57+
}
58+
}

0 commit comments

Comments
 (0)