This repository was archived by the owner on Mar 27, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlevel.go
More file actions
85 lines (77 loc) · 1.55 KB
/
Copy pathlevel.go
File metadata and controls
85 lines (77 loc) · 1.55 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
81
82
83
84
85
package logger
import (
"bytes"
"io"
"io/ioutil"
"sync"
)
// LevelFilter ...
type LevelFilter interface {
io.Writer
Check(line []byte) bool
SetMinLevel(min LogLevel)
}
type levelFilter struct {
once sync.Once
writer io.Writer
badLevels map[LogLevel]struct{}
levels []LogLevel
minLevel LogLevel
}
// NewLevelFilter ...
func NewLevelFilter(opts ...LevelFilterOption) LevelFilter {
result := &levelFilter{
once: sync.Once{},
}
for _, opt := range opts {
opt(result)
}
if result.writer == nil {
result.writer = ioutil.Discard
}
if len(result.minLevel) == 0 {
result.SetMinLevel(InfoLevel)
}
if len(result.levels) == 0 {
result.levels = DefaultLogLevels
}
return result
}
// Check will check a given line if it would be included in the level
// filter.
func (l *levelFilter) Check(line []byte) bool {
l.once.Do(l.init)
// Check for a log level
var level LogLevel
x := bytes.IndexByte(line, '[')
if x >= 0 {
y := bytes.IndexByte(line[x:], ']')
if y >= 0 {
level = LogLevel(line[x+1 : x+y])
}
}
_, ok := l.badLevels[level]
return !ok
}
// Write ...
func (l *levelFilter) Write(p []byte) (n int, err error) {
if !l.Check(p) {
return len(p), nil
}
return l.writer.Write(p)
}
// SetMinLevel is used to update the minimum log level
func (l *levelFilter) SetMinLevel(min LogLevel) {
l.minLevel = min
l.init()
}
func (l *levelFilter) init() {
badLevels := make(map[LogLevel]struct{})
for _, level := range l.levels {
if level == l.minLevel {
break
}
badLevels[level] = struct{}{}
}
l.badLevels = badLevels
}