logfmt.go

 1package log
 2
 3import (
 4	"errors"
 5	"fmt"
 6	"time"
 7
 8	"github.com/go-logfmt/logfmt"
 9)
10
11func (l *Logger) logfmtFormatter(keyvals ...interface{}) {
12	e := logfmt.NewEncoder(&l.b)
13
14	for i := 0; i < len(keyvals); i += 2 {
15		switch keyvals[i] {
16		case TimestampKey:
17			if t, ok := keyvals[i+1].(time.Time); ok {
18				keyvals[i+1] = t.Format(l.timeFormat)
19			}
20		default:
21			if key := fmt.Sprint(keyvals[i]); key != "" {
22				keyvals[i] = key
23			}
24		}
25		err := e.EncodeKeyval(keyvals[i], keyvals[i+1])
26		if err != nil && errors.Is(err, logfmt.ErrUnsupportedValueType) {
27			// If the value is not supported by logfmt, we try to convert it to a string.
28			_ = e.EncodeKeyval(keyvals[i], fmt.Sprintf("%+v", keyvals[i+1]))
29		}
30	}
31	_ = e.EndRecord()
32}