Skip to content

Commit ec9b73a

Browse files
MaruHylChrisHines
authored andcommitted
Add a log adapter for zap.Logger (#855)
1 parent 8c84d88 commit ec9b73a

2 files changed

Lines changed: 126 additions & 0 deletions

File tree

log/zap/zap_sugar_logger.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package zap
2+
3+
import (
4+
"github.com/go-kit/kit/log"
5+
"go.uber.org/zap"
6+
"go.uber.org/zap/zapcore"
7+
)
8+
9+
type zapSugarLogger func(msg string, keysAndValues ...interface{})
10+
11+
func (l zapSugarLogger) Log(kv ...interface{}) error {
12+
l("", kv...)
13+
return nil
14+
}
15+
16+
// NewZapSugarLogger returns a Go kit log.Logger that sends
17+
// log events to a zap.Logger.
18+
func NewZapSugarLogger(logger *zap.Logger, level zapcore.Level) log.Logger {
19+
sugarLogger := logger.WithOptions(zap.AddCallerSkip(2)).Sugar()
20+
var sugar zapSugarLogger
21+
switch level {
22+
case zapcore.DebugLevel:
23+
sugar = sugarLogger.Debugw
24+
case zapcore.InfoLevel:
25+
sugar = sugarLogger.Infow
26+
case zapcore.WarnLevel:
27+
sugar = sugarLogger.Warnw
28+
case zapcore.ErrorLevel:
29+
sugar = sugarLogger.Errorw
30+
case zapcore.DPanicLevel:
31+
sugar = sugarLogger.DPanicw
32+
case zapcore.PanicLevel:
33+
sugar = sugarLogger.Panicw
34+
case zapcore.FatalLevel:
35+
sugar = sugarLogger.Fatalw
36+
default:
37+
sugar = sugarLogger.Infow
38+
}
39+
return sugar
40+
}

log/zap/zap_sugar_logger_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package zap_test
2+
3+
import (
4+
"encoding/json"
5+
kitzap "github.com/go-kit/kit/log/zap"
6+
"go.uber.org/zap"
7+
"go.uber.org/zap/zapcore"
8+
"strings"
9+
"testing"
10+
)
11+
12+
func TestZapSugarLogger(t *testing.T) {
13+
// logger config
14+
encoderConfig := zap.NewDevelopmentEncoderConfig()
15+
encoder := zapcore.NewJSONEncoder(encoderConfig)
16+
levelKey := encoderConfig.LevelKey
17+
// basic test cases
18+
type testCase struct {
19+
level zapcore.Level
20+
kvs []interface{}
21+
want map[string]string
22+
}
23+
testCases := []testCase{
24+
{level: zapcore.DebugLevel, kvs: []interface{}{"key1", "value1"},
25+
want: map[string]string{levelKey: "DEBUG", "key1": "value1"}},
26+
27+
{level: zapcore.InfoLevel, kvs: []interface{}{"key2", "value2"},
28+
want: map[string]string{levelKey: "INFO", "key2": "value2"}},
29+
30+
{level: zapcore.WarnLevel, kvs: []interface{}{"key3", "value3"},
31+
want: map[string]string{levelKey: "WARN", "key3": "value3"}},
32+
33+
{level: zapcore.ErrorLevel, kvs: []interface{}{"key4", "value4"},
34+
want: map[string]string{levelKey: "ERROR", "key4": "value4"}},
35+
36+
{level: zapcore.DPanicLevel, kvs: []interface{}{"key5", "value5"},
37+
want: map[string]string{levelKey: "DPANIC", "key5": "value5"}},
38+
39+
{level: zapcore.PanicLevel, kvs: []interface{}{"key6", "value6"},
40+
want: map[string]string{levelKey: "PANIC", "key6": "value6"}},
41+
}
42+
// test
43+
for _, testCase := range testCases {
44+
t.Run(testCase.level.String(), func(t *testing.T) {
45+
// make logger
46+
writer := &tbWriter{tb: t}
47+
logger := zap.New(
48+
zapcore.NewCore(encoder, zapcore.AddSync(writer), zap.DebugLevel),
49+
zap.Development())
50+
// check panic
51+
shouldPanic := testCase.level >= zapcore.DPanicLevel
52+
kitLogger := kitzap.NewZapSugarLogger(logger, testCase.level)
53+
defer func() {
54+
isPanic := recover() != nil
55+
if shouldPanic != isPanic {
56+
t.Errorf("test level %v should panic(%v), but %v", testCase.level, shouldPanic, isPanic)
57+
}
58+
// check log kvs
59+
logMap := make(map[string]string)
60+
err := json.Unmarshal([]byte(writer.sb.String()), &logMap)
61+
if err != nil {
62+
t.Errorf("unmarshal error: %v", err)
63+
} else {
64+
for k, v := range testCase.want {
65+
vv, ok := logMap[k]
66+
if !ok || v != vv {
67+
t.Error("error log")
68+
}
69+
}
70+
}
71+
}()
72+
kitLogger.Log(testCase.kvs...)
73+
})
74+
}
75+
}
76+
77+
type tbWriter struct {
78+
tb testing.TB
79+
sb strings.Builder
80+
}
81+
82+
func (w *tbWriter) Write(b []byte) (n int, err error) {
83+
w.tb.Logf(string(b))
84+
w.sb.Write(b)
85+
return len(b), nil
86+
}

0 commit comments

Comments
 (0)