Codebase list golang-github-go-kit-kit / 9890679
Add logrus adapter for Logger interface (#752) (#759) Add logrus adapter for Logger interface (#752) Aswin M Prabhu authored 5 years ago Chris Hines committed 5 years ago
2 changed file(s) with 90 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 // Package logrus provides an adapter to the
1 // go-kit log.Logger interface.
2 package logrus
3
4 import (
5 "errors"
6 "fmt"
7
8 "github.com/go-kit/kit/log"
9 "github.com/sirupsen/logrus"
10 )
11
12 type logrusLogger struct {
13 *logrus.Logger
14 }
15
16 var errMissingValue = errors.New("(MISSING)")
17
18 // NewLogrusLogger returns a go-kit log.Logger that sends log events to a Logrus logger.
19 func NewLogrusLogger(logger *logrus.Logger) log.Logger {
20 return &logrusLogger{logger}
21 }
22
23 func (l logrusLogger) Log(keyvals ...interface{}) error {
24 fields := logrus.Fields{}
25 for i := 0; i < len(keyvals); i += 2 {
26 if i+1 < len(keyvals) {
27 fields[fmt.Sprint(keyvals[i])] = keyvals[i+1]
28 } else {
29 fields[fmt.Sprint(keyvals[i])] = errMissingValue
30 }
31 }
32 l.WithFields(fields).Info()
33 return nil
34 }
0 package logrus_test
1
2 import (
3 "bytes"
4 "errors"
5 "strings"
6 "testing"
7
8 log "github.com/go-kit/kit/log/logrus"
9 "github.com/sirupsen/logrus"
10 )
11
12 func TestLogrusLogger(t *testing.T) {
13 t.Parallel()
14 buf := &bytes.Buffer{}
15 logrusLogger := logrus.New()
16 logrusLogger.Out = buf
17 logrusLogger.Formatter = &logrus.TextFormatter{TimestampFormat: "02-01-2006 15:04:05", FullTimestamp: true}
18 logger := log.NewLogrusLogger(logrusLogger)
19
20 if err := logger.Log("hello", "world"); err != nil {
21 t.Fatal(err)
22 }
23 if want, have := "hello=world\n", strings.Split(buf.String(), " ")[3]; want != have {
24 t.Errorf("want %#v, have %#v", want, have)
25 }
26
27 buf.Reset()
28 if err := logger.Log("a", 1, "err", errors.New("error")); err != nil {
29 t.Fatal(err)
30 }
31 if want, have := "a=1 err=error", strings.TrimSpace(strings.SplitAfterN(buf.String(), " ", 4)[3]); want != have {
32 t.Errorf("want %#v, have %#v", want, have)
33 }
34
35 buf.Reset()
36 if err := logger.Log("a", 1, "b"); err != nil {
37 t.Fatal(err)
38 }
39 if want, have := "a=1 b=\"(MISSING)\"", strings.TrimSpace(strings.SplitAfterN(buf.String(), " ", 4)[3]); want != have {
40 t.Errorf("want %#v, have %#v", want, have)
41 }
42
43 buf.Reset()
44 if err := logger.Log("my_map", mymap{0: 0}); err != nil {
45 t.Fatal(err)
46 }
47 if want, have := "my_map=special_behavior", strings.TrimSpace(strings.Split(buf.String(), " ")[3]); want != have {
48 t.Errorf("want %#v, have %#v", want, have)
49 }
50 }
51
52 type mymap map[int]int
53
54 func (m mymap) String() string { return "special_behavior" }