Skip to content
This repository was archived by the owner on Aug 1, 2024. It is now read-only.

Commit c06381e

Browse files
committed
feat(onelog): add With method to add fields to the logger
1 parent 85ce35a commit c06381e

File tree

11 files changed

+134
-66
lines changed

11 files changed

+134
-66
lines changed

adapter/nop/adapter.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type (
2323
// NewAdapter returns a new adapter. The nop adapter does not log anything and can be used as a placeholder or fallback.
2424
func NewAdapter() onelog.Logger { return &Adapter{} }
2525

26+
func (a *Adapter) With(_ ...any) onelog.Logger { return a }
2627
func (a *Adapter) Debug() onelog.LoggerContext { return &Context{} }
2728
func (a *Adapter) Info() onelog.LoggerContext { return &Context{} }
2829
func (a *Adapter) Warn() onelog.LoggerContext { return &Context{} }

adapter/slog/adapter.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ func (a *Adapter) newContext(level slog.Level) *Context {
4747
}
4848
}
4949

50+
// With returns the logger with the given fields.
51+
func (a *Adapter) With(fields ...any) onelog.Logger {
52+
return &Adapter{logger: a.logger.With(fields...)}
53+
}
54+
5055
// Debug returns a LoggerContext for a debug log. To send the log, use the Msg or Msgf methods.
5156
func (a *Adapter) Debug() onelog.LoggerContext {
5257
return a.newContext(slog.LevelDebug)

adapter/slog/adapter_test.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,66 @@ package slogadapter
22

33
import (
44
"bytes"
5+
"io"
56
"testing"
67

8+
"github.com/nikoksr/onelog"
9+
710
"github.com/stretchr/testify/assert"
811
"golang.org/x/exp/slog"
912

1013
"github.com/nikoksr/onelog/internal/testutils"
1114
)
1215

16+
func newTestingAdapter(out io.Writer) onelog.Logger {
17+
handler := slog.NewJSONHandler(out, &slog.HandlerOptions{
18+
Level: slog.LevelDebug,
19+
})
20+
logger := slog.New(handler)
21+
return NewAdapter(logger)
22+
}
23+
1324
// TestNewAdapter tests if NewAdapter returns a non-nil *Adapter.
1425
func TestNewAdapter(t *testing.T) {
1526
t.Parallel()
1627

17-
slogLogger := slog.Default()
18-
logger := NewAdapter(slogLogger)
28+
adapter := newTestingAdapter(io.Discard)
1929

20-
assert.NotNil(t, logger, "the returned adapter should not be nil")
30+
assert.NotNil(t, adapter, "the returned adapter should not be nil")
2131
}
2232

2333
// TestContexts tests if each log level returns a valid *Context.
2434
func TestContexts(t *testing.T) {
2535
t.Parallel()
2636

27-
slogLogger := slog.Default()
28-
logger := NewAdapter(slogLogger)
37+
adapter := newTestingAdapter(io.Discard)
2938

3039
// Debug
31-
logContext := logger.Debug()
40+
logContext := adapter.Debug()
3241
assert.NotNil(t, logContext, "the returned context should not be nil")
3342
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
3443
assert.Equal(t, logContext.(*Context).level, slog.LevelDebug, "the returned context should have the correct log level")
3544

3645
// Info
37-
logContext = logger.Info()
46+
logContext = adapter.Info()
3847
assert.NotNil(t, logContext, "the returned context should not be nil")
3948
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
4049
assert.Equal(t, logContext.(*Context).level, slog.LevelInfo, "the returned context should have the correct log level")
4150

4251
// Warn
43-
logContext = logger.Warn()
52+
logContext = adapter.Warn()
4453
assert.NotNil(t, logContext, "the returned context should not be nil")
4554
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
4655
assert.Equal(t, logContext.(*Context).level, slog.LevelWarn, "the returned context should have the correct log level")
4756

4857
// Error
49-
logContext = logger.Error()
58+
logContext = adapter.Error()
5059
assert.NotNil(t, logContext, "the returned context should not be nil")
5160
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
5261
assert.Equal(t, logContext.(*Context).level, slog.LevelError, "the returned context should have the correct log level")
5362

5463
// Fatal; note that slog does not have a fatal level, so this should return an error level context
55-
logContext = logger.Fatal()
64+
logContext = adapter.Fatal()
5665
assert.NotNil(t, logContext, "the returned context should not be nil")
5766
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
5867
assert.Equal(t, logContext.(*Context).level, slog.LevelError, "the returned context should have the correct log level")
@@ -63,11 +72,7 @@ func TestMethods(t *testing.T) {
6372
t.Parallel()
6473

6574
buff := new(bytes.Buffer)
66-
handler := slog.NewJSONHandler(buff, &slog.HandlerOptions{
67-
Level: slog.LevelDebug,
68-
})
69-
logger := slog.New(handler)
70-
adapter := NewAdapter(logger)
75+
adapter := newTestingAdapter(buff)
7176

7277
testutils.TestingMethods(t, adapter, buff)
7378
}

adapter/zap/adapter.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ func (a *Adapter) newContext(level zapcore.Level) onelog.LoggerContext {
4646
}
4747
}
4848

49+
// With returns the logger with the given fields.
50+
func (a *Adapter) With(fields ...any) onelog.Logger {
51+
return &Adapter{logger: a.logger.Sugar().With(fields...).Desugar()}
52+
}
53+
4954
// Debug returns a LoggerContext for a debug log. To send the log, use the Msg or Msgf methods.
5055
func (a *Adapter) Debug() onelog.LoggerContext {
5156
return a.newContext(zap.DebugLevel)

adapter/zap/adapter_test.go

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,86 +2,90 @@ package zapadapter
22

33
import (
44
"bytes"
5+
"io"
56
"testing"
67

8+
"github.com/nikoksr/onelog"
9+
710
"github.com/stretchr/testify/assert"
811
"go.uber.org/zap"
912
"go.uber.org/zap/zapcore"
1013

1114
"github.com/nikoksr/onelog/internal/testutils"
1215
)
1316

17+
func newLogger(out io.Writer) *zap.Logger {
18+
return zap.New(
19+
zapcore.NewCore(
20+
zapcore.NewJSONEncoder(zapcore.EncoderConfig{
21+
MessageKey: "msg",
22+
TimeKey: "time",
23+
EncodeTime: zapcore.RFC3339NanoTimeEncoder,
24+
EncodeDuration: zapcore.NanosDurationEncoder,
25+
}),
26+
zapcore.AddSync(out),
27+
zapcore.DebugLevel,
28+
),
29+
zap.ErrorOutput(zapcore.AddSync(out)),
30+
)
31+
}
32+
33+
func newAdapter(out io.Writer) onelog.Logger {
34+
return NewAdapter(newLogger(out))
35+
}
36+
1437
// TestNewAdapter tests if NewAdapter returns a non-nil *Adapter.
1538
func TestNewAdapter(t *testing.T) {
1639
t.Parallel()
1740

18-
zapLogger, _ := zap.NewDevelopment()
19-
logger := NewAdapter(zapLogger)
41+
adapter := newAdapter(io.Discard)
2042

21-
assert.NotNil(t, logger, "the returned adapter should not be nil")
43+
assert.NotNil(t, adapter, "the returned adapter should not be nil")
2244
}
2345

2446
// TestContexts tests if each log level returns a valid *Context.
2547
func TestContexts(t *testing.T) {
2648
t.Parallel()
2749

28-
zapLogger, _ := zap.NewDevelopment()
29-
logger := NewAdapter(zapLogger)
50+
adapter := newAdapter(io.Discard)
3051

3152
// Debug
32-
logContext := logger.Debug()
53+
logContext := adapter.Debug()
3354
assert.NotNil(t, logContext, "the returned context should not be nil")
3455
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
3556
assert.Equal(t, logContext.(*Context).level, zap.DebugLevel, "the returned context should have the correct log level")
3657

3758
// Info
38-
logContext = logger.Info()
59+
logContext = adapter.Info()
3960
assert.NotNil(t, logContext, "the returned context should not be nil")
4061
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
4162
assert.Equal(t, logContext.(*Context).level, zap.InfoLevel, "the returned context should have the correct log level")
4263

4364
// Warn
44-
logContext = logger.Warn()
65+
logContext = adapter.Warn()
4566
assert.NotNil(t, logContext, "the returned context should not be nil")
4667
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
4768
assert.Equal(t, logContext.(*Context).level, zap.WarnLevel, "the returned context should have the correct log level")
4869

4970
// Error
50-
logContext = logger.Error()
71+
logContext = adapter.Error()
5172
assert.NotNil(t, logContext, "the returned context should not be nil")
5273
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
5374
assert.Equal(t, logContext.(*Context).level, zap.ErrorLevel, "the returned context should have the correct log level")
5475

5576
// Fatal
56-
logContext = logger.Fatal()
77+
logContext = adapter.Fatal()
5778
assert.NotNil(t, logContext, "the returned context should not be nil")
5879
assert.IsType(t, new(Context), logContext, "the returned context should be of type *Context")
5980
assert.Equal(t, logContext.(*Context).level, zap.FatalLevel, "the returned context should have the correct log level")
6081
}
6182

62-
func newTestingLogger(buff *bytes.Buffer) *zap.Logger {
63-
return zap.New(
64-
zapcore.NewCore(
65-
zapcore.NewJSONEncoder(zapcore.EncoderConfig{
66-
MessageKey: "msg",
67-
TimeKey: "time",
68-
EncodeTime: zapcore.RFC3339NanoTimeEncoder,
69-
EncodeDuration: zapcore.NanosDurationEncoder,
70-
}),
71-
zapcore.AddSync(buff),
72-
zapcore.DebugLevel,
73-
),
74-
zap.ErrorOutput(zapcore.AddSync(buff)),
75-
)
76-
}
77-
7883
// TestMethods tests if each method returns a non-nil *Context and if the log is written correctly.
7984
func TestMethods(t *testing.T) {
8085
t.Parallel()
8186

8287
buff := new(bytes.Buffer)
83-
logger := newTestingLogger(buff)
84-
adapter := NewAdapter(logger)
88+
adapter := newAdapter(buff)
8589

8690
testutils.TestingMethods(t, adapter, buff)
8791
}

adapter/zap/sugared_adapter.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ func (a *SugarAdapter) newContext(level zapcore.Level) onelog.LoggerContext {
4747
}
4848
}
4949

50+
// With returns the logger with the given fields.
51+
func (a *SugarAdapter) With(fields ...any) onelog.Logger {
52+
return &SugarAdapter{logger: a.logger.With(fields...)}
53+
}
54+
5055
// Debug returns a LoggerContext for a debug log. To send the log, use the Msg or Msgf methods.
5156
func (a *SugarAdapter) Debug() onelog.LoggerContext {
5257
return a.newContext(zapcore.DebugLevel)

adapter/zap/sugared_adapter_test.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,62 @@ package zapadapter
22

33
import (
44
"bytes"
5+
"io"
56
"testing"
67

8+
"github.com/nikoksr/onelog"
9+
710
"github.com/stretchr/testify/assert"
811
"go.uber.org/zap"
912

1013
"github.com/nikoksr/onelog/internal/testutils"
1114
)
1215

16+
func newSugarAdapter(out io.Writer) onelog.Logger {
17+
return NewSugarAdapter(newLogger(out).Sugar())
18+
}
19+
1320
// TestNewSugarAdapter tests if NewSugarAdapter returns a non-nil *Adapter.
1421
func TestNewSugarAdapter(t *testing.T) {
1522
t.Parallel()
1623

17-
zapLogger, _ := zap.NewDevelopment()
18-
logger := NewSugarAdapter(zapLogger.Sugar())
24+
adapter := newSugarAdapter(io.Discard)
1925

20-
assert.NotNil(t, logger, "the returned adapter should not be nil")
26+
assert.NotNil(t, adapter, "the returned adapter should not be nil")
2127
}
2228

2329
// TestSugarContexts tests if each log level returns a valid *Context.
2430
func TestSugarContexts(t *testing.T) {
2531
t.Parallel()
2632

27-
zapLogger, _ := zap.NewDevelopment()
28-
logger := NewSugarAdapter(zapLogger.Sugar())
33+
adapter := newSugarAdapter(io.Discard)
2934

3035
// Debug
31-
logContext := logger.Debug()
36+
logContext := adapter.Debug()
3237
assert.NotNil(t, logContext, "the returned context should not be nil")
3338
assert.IsType(t, new(SugarContext), logContext, "the returned context should be of type *Context")
3439
assert.Equal(t, logContext.(*SugarContext).level, zap.DebugLevel, "the returned context should have the correct log level")
3540

3641
// Info
37-
logContext = logger.Info()
42+
logContext = adapter.Info()
3843
assert.NotNil(t, logContext, "the returned context should not be nil")
3944
assert.IsType(t, new(SugarContext), logContext, "the returned context should be of type *Context")
4045
assert.Equal(t, logContext.(*SugarContext).level, zap.InfoLevel, "the returned context should have the correct log level")
4146

4247
// Warn
43-
logContext = logger.Warn()
48+
logContext = adapter.Warn()
4449
assert.NotNil(t, logContext, "the returned context should not be nil")
4550
assert.IsType(t, new(SugarContext), logContext, "the returned context should be of type *Context")
4651
assert.Equal(t, logContext.(*SugarContext).level, zap.WarnLevel, "the returned context should have the correct log level")
4752

4853
// Error
49-
logContext = logger.Error()
54+
logContext = adapter.Error()
5055
assert.NotNil(t, logContext, "the returned context should not be nil")
5156
assert.IsType(t, new(SugarContext), logContext, "the returned context should be of type *Context")
5257
assert.Equal(t, logContext.(*SugarContext).level, zap.ErrorLevel, "the returned context should have the correct log level")
5358

5459
// Fatal
55-
logContext = logger.Fatal()
60+
logContext = adapter.Fatal()
5661
assert.NotNil(t, logContext, "the returned context should not be nil")
5762
assert.IsType(t, new(SugarContext), logContext, "the returned context should be of type *Context")
5863
assert.Equal(t, logContext.(*SugarContext).level, zap.FatalLevel, "the returned context should have the correct log level")
@@ -63,8 +68,7 @@ func TestSugarMethods(t *testing.T) {
6368
t.Parallel()
6469

6570
buff := new(bytes.Buffer)
66-
logger := newTestingLogger(buff)
67-
adapter := NewSugarAdapter(logger.Sugar())
71+
adapter := newSugarAdapter(buff)
6872

6973
testutils.TestingMethods(t, adapter, buff)
7074
}

adapter/zerolog/adapter.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ func NewAdapter(l *zerolog.Logger) onelog.Logger {
3737
}
3838
}
3939

40+
// With returns the logger with the given fields.
41+
func (a *Adapter) With(fields ...any) onelog.Logger {
42+
logger := a.logger.With().Fields(fields).Logger()
43+
return &Adapter{logger: &logger}
44+
}
45+
4046
// Debug returns a LoggerContext for a debug log. To send the log, use the Msg or Msgf methods.
4147
func (a *Adapter) Debug() onelog.LoggerContext {
4248
return &Context{

0 commit comments

Comments
 (0)