diff --git a/log.go b/log.go index dd71437..07c06a8 100644 --- a/log.go +++ b/log.go @@ -87,6 +87,10 @@ func New(opts Opts) Logger { opts.CallerSkipFrameCount = 3 } + if len(opts.DefaultFields)%2 != 0 { + opts.DefaultFields = opts.DefaultFields[0 : len(opts.DefaultFields)-1] + } + return Logger{ out: newSyncWriter(opts.Writer), Opts: opts, @@ -195,7 +199,7 @@ func (l Logger) handleLog(msg string, lvl Level, fields ...any) { // If there are odd number of fields, ignore the last. if fieldCount%2 != 0 { - fields = fields[0 : fieldCount-1] + fields = fields[0 : len(fields)-1] } for i := range l.DefaultFields { diff --git a/log_test.go b/log_test.go index a5f1257..f4faed3 100644 --- a/log_test.go +++ b/log_test.go @@ -223,6 +223,18 @@ func TestOddNumberedFields(t *testing.T) { buf.Reset() } +func TestOddNumberedFieldsWithDefaultFields(t *testing.T) { + buf := &bytes.Buffer{} + l := New(Opts{Writer: buf, DefaultFields: []any{ + "defaultkey", "defaultval", + }}) + + // Give a odd number of fields. + l.Info("hello world", "key1", "val1", "key2") + require.Contains(t, buf.String(), `level=info message="hello world" defaultkey=defaultval key1=val1`) + buf.Reset() +} + // These test are typically meant to be run with the data race detector. func TestLoggerConcurrency(t *testing.T) { buf := &bytes.Buffer{}