...
1 package ctxkit
2
3 import (
4 "context"
5
6 "github.com/go-kit/log"
7 grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags"
8 )
9
10 type ctxMarker struct{}
11
12 type ctxLogger struct {
13 logger log.Logger
14 fields []interface{}
15 }
16
17 var (
18 ctxMarkerKey = &ctxMarker{}
19 )
20
21
22 func AddFields(ctx context.Context, fields ...interface{}) {
23 l, ok := ctx.Value(ctxMarkerKey).(*ctxLogger)
24 if !ok || l == nil {
25 return
26 }
27 l.fields = append(l.fields, fields...)
28 }
29
30
31
32
33 func Extract(ctx context.Context) log.Logger {
34 l, ok := ctx.Value(ctxMarkerKey).(*ctxLogger)
35 if !ok || l == nil {
36 return log.NewNopLogger()
37 }
38
39 fields := TagsToFields(ctx)
40 return log.With(l.logger, append(fields, l.fields...)...)
41 }
42
43
44 func TagsToFields(ctx context.Context) []interface{} {
45 var fields []interface{}
46 tags := grpc_ctxtags.Extract(ctx)
47 for k, v := range tags.Values() {
48 fields = append(fields, k, v)
49 }
50 return fields
51 }
52
53
54
55 func ToContext(ctx context.Context, logger log.Logger) context.Context {
56 l := &ctxLogger{
57 logger: logger,
58 }
59 return context.WithValue(ctx, ctxMarkerKey, l)
60 }
61
View as plain text