-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcontext_extractor.go
More file actions
80 lines (60 loc) · 1.65 KB
/
Copy pathcontext_extractor.go
File metadata and controls
80 lines (60 loc) · 1.65 KB
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
package log
import (
"context"
"github.com/upfluence/log/record"
)
type ContextExtractor interface {
Extract(context.Context, record.Level) []record.Field
}
type noopExtractor struct{}
func (noopExtractor) Extract(context.Context, record.Level) []record.Field {
return nil
}
type multiContextExtractor []ContextExtractor
func (ces multiContextExtractor) Extract(ctx context.Context, lvl record.Level) []record.Field {
var fs []record.Field
for _, ce := range ces {
fs = append(fs, ce.Extract(ctx, lvl)...)
}
return fs
}
func mergeContextExtractor(lce, rce ContextExtractor) ContextExtractor {
switch tlce := lce.(type) {
case noopExtractor:
return rce
case multiContextExtractor:
return multiContextExtractor(append(tlce, rce))
default:
return multiContextExtractor([]ContextExtractor{lce, rce})
}
}
func CombineContextExtractors(ces ...ContextExtractor) ContextExtractor {
switch len(ces) {
case 0:
return noopExtractor{}
case 1:
return ces[0]
}
ce, ces := ces[0], ces[1:]
for _, rce := range ces {
ce = mergeContextExtractor(ce, rce)
}
return ce
}
type ContextExtractorFunc func(context.Context, record.Level) []record.Field
func (fn ContextExtractorFunc) Extract(ctx context.Context, lvl record.Level) []record.Field {
return fn(ctx, lvl)
}
type leveledContextExtractor struct {
ce ContextExtractor
lvl record.Level
}
func LeveledContextExtractor(ce ContextExtractor, lvl record.Level) ContextExtractor {
return &leveledContextExtractor{ce: ce, lvl: lvl}
}
func (lce *leveledContextExtractor) Extract(ctx context.Context, lvl record.Level) []record.Field {
if lvl < lce.lvl {
return nil
}
return lce.ce.Extract(ctx, lvl)
}