/
buffer.go
65 lines (54 loc) · 1.09 KB
/
buffer.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
package handler
import (
"github.com/syyongx/llog/types"
)
// Buffer struct definition
type Buffer struct {
Handler
handler types.IHandler
records chan *types.Record
close chan bool
}
// NewBuffer New async handler
// bufSize: channel buffer size.
func NewBuffer(handler types.IHandler, bufSize, level int, bubble bool) *Buffer {
buf := &Buffer{
handler: handler,
records: make(chan *types.Record, bufSize),
close: make(chan bool, 0),
}
buf.SetLevel(level)
buf.SetBubble(bubble)
// async
go func() {
for {
record := <-buf.records
if record == nil {
buf.handler.Close()
buf.close <- true
break
}
buf.handler.Handle(record)
}
}()
return buf
}
// Handle handles a record.
func (b *Buffer) Handle(record *types.Record) bool {
if !b.IsHandling(record) {
return false
}
b.records <- record
return false == b.GetBubble()
}
// HandleBatch Handles a set of records.
func (b *Buffer) HandleBatch(records []*types.Record) {
for _, record := range records {
b.Handle(record)
}
}
// Close close
func (b *Buffer) Close() {
b.records <- nil
<-b.close
}