@@ -13,37 +13,48 @@ import (
13
13
)
14
14
15
15
var (
16
- defaultAddress = "127.0.0.1:24224"
16
+ defaultAddress = "127.0.0.1:24224"
17
+ defaultFlushInterval = 5 * time .Second
17
18
)
18
19
19
20
type Config struct {
20
21
Address string
21
22
ConnectionTimeout time.Duration
23
+ FlushInterval time.Duration
22
24
}
23
25
24
26
func withDefaultConfig (c Config ) Config {
25
27
if c .Address == "" {
26
28
c .Address = defaultAddress
27
29
}
30
+ if c .FlushInterval == 0 {
31
+ c .FlushInterval = defaultFlushInterval
32
+ }
28
33
return c
29
34
}
30
35
31
36
type Logger struct {
32
- conf Config
33
- conn io.WriteCloser
34
- bmu sync.Mutex
35
- cmu sync.Mutex
36
- buf []byte
37
+ conf Config
38
+ conn io.WriteCloser
39
+ bmu sync.Mutex
40
+ cmu sync.Mutex
41
+ buf []byte
42
+ wg sync.WaitGroup
43
+ done chan struct {}
44
+ dirty chan struct {}
37
45
}
38
46
39
47
func NewLogger (c Config ) (* Logger , error ) {
40
48
logger := & Logger {
41
- conf : withDefaultConfig (c ),
42
- buf : []byte {},
49
+ conf : withDefaultConfig (c ),
50
+ buf : []byte {},
51
+ done : make (chan struct {}),
52
+ dirty : make (chan struct {}),
43
53
}
44
54
if err := logger .connect (); err != nil {
45
55
return nil , err
46
56
}
57
+ logger .start ()
47
58
return logger , nil
48
59
}
49
60
@@ -69,10 +80,14 @@ func (logger *Logger) PostWithTime(tag string, t time.Time, obj interface{}) err
69
80
logger .buf = append (logger .buf , raw ... )
70
81
logger .bmu .Unlock ()
71
82
72
- return logger .send ()
83
+ go func () {
84
+ logger .dirty <- struct {}{}
85
+ }()
86
+ return nil
73
87
}
74
88
75
89
func (logger * Logger ) Close () error {
90
+ logger .stop ()
76
91
return logger .disconnect ()
77
92
}
78
93
@@ -137,3 +152,26 @@ func (logger *Logger) send() error {
137
152
138
153
return err
139
154
}
155
+
156
+ func (logger * Logger ) start () {
157
+ ticker := time .NewTicker (logger .conf .FlushInterval )
158
+ logger .wg .Add (1 )
159
+ go func () {
160
+ defer logger .wg .Done ()
161
+ for {
162
+ select {
163
+ case <- logger .done :
164
+ logger .send ()
165
+ return
166
+ case <- logger .dirty :
167
+ case <- ticker .C :
168
+ }
169
+ logger .send ()
170
+ }
171
+ }()
172
+ }
173
+
174
+ func (logger * Logger ) stop () {
175
+ close (logger .done )
176
+ logger .wg .Wait ()
177
+ }
0 commit comments