forked from dghubble/sling
/
logger.go
91 lines (72 loc) · 1.91 KB
/
logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package sling
import (
"context"
"io"
stdlog "log"
"github.com/go-logr/logr"
"github.com/go-logr/stdr"
"go.opentelemetry.io/otel/trace"
)
type Logger interface {
WithContext(ctx context.Context) Logger
WithFields(keyValues Fields) Logger
Info(msg string)
Infof(format string, args ...interface{})
Error(msg string)
Errorf(format string, args ...interface{})
}
type Fields map[string]interface{}
type defaultLogger struct {
logger logr.Logger
extractor []ContextExtractor
}
type ContextExtractor func(context.Context) map[string]interface{}
func NewDefaultLogger() Logger {
logr := stdr.New(
stdlog.New(io.Discard, "", stdlog.LstdFlags),
)
return &defaultLogger{logger: logr}
}
func (l *defaultLogger) WithContext(ctx context.Context) Logger {
span := trace.SpanFromContext(ctx)
sc := span.SpanContext()
ctxValues := make([]interface{}, 0)
if sc.HasTraceID() && sc.TraceID().IsValid() {
ctxValues = append(ctxValues, "TraceId", sc.TraceID().String())
}
if sc.HasSpanID() && sc.SpanID().IsValid() {
ctxValues = append(ctxValues, "SpanId", sc.SpanID().String())
}
for _, extractor := range l.extractor {
m := extractor(ctx)
for k, v := range m {
ctxValues = append(ctxValues, k, v)
}
}
return &defaultLogger{
logger: l.logger.WithValues(ctxValues...),
extractor: l.extractor,
}
}
func (log *defaultLogger) Info(msg string) {
log.logger.Info(msg)
}
func (log *defaultLogger) Infof(format string, args ...interface{}) {
log.logger.Info(format)
}
func (l *defaultLogger) WithFields(keyValues Fields) Logger {
kvs := make([]interface{}, 0)
for k, v := range keyValues {
kvs = append(kvs, k, v)
}
return &defaultLogger{
logger: l.logger.WithValues(kvs...),
extractor: l.extractor,
}
}
func (log *defaultLogger) Error(msg string) {
log.logger.Error(nil, msg)
}
func (log *defaultLogger) Errorf(format string, args ...interface{}) {
log.logger.Error(nil, format, args...)
}