-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathprocessor.go
More file actions
128 lines (107 loc) · 2.5 KB
/
processor.go
File metadata and controls
128 lines (107 loc) · 2.5 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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package slog
import (
"crypto/md5"
"encoding/hex"
"os"
"runtime"
"github.com/gookit/goutil/strutil"
)
//
// Processor interface
//
// Processor interface definition
type Processor interface {
// Process record
Process(record *Record)
}
// ProcessorFunc wrapper definition
type ProcessorFunc func(record *Record)
// Process record
func (fn ProcessorFunc) Process(record *Record) {
fn(record)
}
// ProcessableHandler interface
type ProcessableHandler interface {
// AddProcessor add a processor
AddProcessor(Processor)
// ProcessRecord handle a record
ProcessRecord(record *Record)
}
// Processable definition
type Processable struct {
processors []Processor
}
// AddProcessor to the handler
func (p *Processable) AddProcessor(processor Processor) {
p.processors = append(p.processors, processor)
}
// ProcessRecord process record
func (p *Processable) ProcessRecord(r *Record) {
// processing log record
for _, processor := range p.processors {
processor.Process(r)
}
}
//
// there are some built-in processors
//
// AddHostname to record
func AddHostname() Processor {
hostname, _ := os.Hostname()
return ProcessorFunc(func(record *Record) {
record.AddField("hostname", hostname)
})
}
// AddUniqueID to record
func AddUniqueID(fieldName string) Processor {
hs := md5.New()
return ProcessorFunc(func(record *Record) {
rb, _ := strutil.RandomBytes(32)
hs.Write(rb)
randomID := hex.EncodeToString(hs.Sum(nil))
hs.Reset()
record.AddField(fieldName, randomID)
})
}
// MemoryUsage get memory usage.
var MemoryUsage ProcessorFunc = func(record *Record) {
stat := new(runtime.MemStats)
runtime.ReadMemStats(stat)
record.SetExtraValue("memoryUsage", stat.Alloc)
}
// AppendCtxKeys append context keys to Record.Fields
func AppendCtxKeys(keys ...string) Processor {
return ProcessorFunc(func(record *Record) {
if record.Ctx == nil {
return
}
for _, key := range keys {
if val := record.Ctx.Value(key); val != nil {
record.AddField(key, val)
}
}
})
}
// CtxKeysProcessor append context keys to Record.Data, Record.Fields, Record.Extra
// - dist: "data" | "fields" | "extra"
func CtxKeysProcessor(dist string, keys ...string) Processor {
return ProcessorFunc(func(r *Record) {
if r.Ctx == nil {
return
}
kvMap := map[string]any{}
for _, key := range keys {
if val := r.Ctx.Value(key); val != nil {
kvMap[key] = val
}
}
switch dist {
case "field", "fields":
r.AddFields(kvMap)
case "ext", "extra":
r.AddExtra(kvMap)
default:
r.AddData(kvMap)
}
})
}