-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlog_level_filter.go
97 lines (86 loc) · 2.31 KB
/
log_level_filter.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
92
93
94
95
96
97
package observability
import (
"context"
"strings"
"github.com/facebookincubator/go-belt"
"github.com/facebookincubator/go-belt/pkg/field"
"github.com/facebookincubator/go-belt/pkg/runtime"
loggertypes "github.com/facebookincubator/go-belt/tool/logger/types"
"github.com/xaionaro-go/xsync"
)
var LogLevelFilter LogLevelFilterT
type LogLevelFilterT struct {
Locker xsync.Mutex
Level loggertypes.Level
}
var _ loggertypes.PreHook = (*LogLevelFilterT)(nil)
func (h *LogLevelFilterT) GetLevel() loggertypes.Level {
ctx := xsync.WithNoLogging(context.TODO(), true)
return xsync.DoR1(ctx, &h.Locker, func() loggertypes.Level {
return h.Level
})
}
func (h *LogLevelFilterT) SetLevel(
level loggertypes.Level,
) {
ctx := xsync.WithNoLogging(context.TODO(), true)
h.Locker.Do(ctx, func() {
h.Level = level
})
}
func (h *LogLevelFilterT) ProcessInput(
traceIDs belt.TraceIDs,
level loggertypes.Level,
args ...any,
) loggertypes.PreHookResult {
ctx := xsync.WithNoLogging(context.TODO(), true)
return xsync.DoR1(ctx, &h.Locker, func() loggertypes.PreHookResult {
if !h.shouldLog(level) {
return loggertypes.PreHookResult{Skip: true}
}
return loggertypes.PreHookResult{}
})
}
func (h *LogLevelFilterT) ProcessInputf(
traceIDs belt.TraceIDs,
level loggertypes.Level,
format string,
args ...any,
) loggertypes.PreHookResult {
ctx := xsync.WithNoLogging(context.TODO(), true)
return xsync.DoR1(ctx, &h.Locker, func() loggertypes.PreHookResult {
if !h.shouldLog(level) {
return loggertypes.PreHookResult{Skip: true}
}
return loggertypes.PreHookResult{}
})
}
func (h *LogLevelFilterT) ProcessInputFields(
traceIDs belt.TraceIDs,
level loggertypes.Level,
message string,
fields field.AbstractFields,
) loggertypes.PreHookResult {
ctx := xsync.WithNoLogging(context.TODO(), true)
return xsync.DoR1(ctx, &h.Locker, func() loggertypes.PreHookResult {
if !h.shouldLog(level) {
return loggertypes.PreHookResult{Skip: true}
}
return loggertypes.PreHookResult{}
})
}
func (h *LogLevelFilterT) shouldLog(level loggertypes.Level) bool {
if level > h.Level {
return false
}
pcs := runtime.CallerStackTrace(runtime.DefaultCallerPCFilter)
for _, pc := range pcs {
file, _ := pc.FileLine()
if strings.Contains(file, "xaionaro-go/kickcom") {
if level == h.Level {
return false
}
}
}
return true
}