...
1
2
3
4
5
6
7 package logger
8
9 import (
10 "encoding/json"
11 "io"
12 "sync"
13 "time"
14 )
15
16
17 type IOSink struct {
18 enc *json.Encoder
19
20
21
22
23 encMu sync.Mutex
24 }
25
26
27 var _ LogSink = &IOSink{}
28
29
30
31 func NewIOSink(out io.Writer) *IOSink {
32 return &IOSink{
33 enc: json.NewEncoder(out),
34 }
35 }
36
37
38 func (sink *IOSink) Info(_ int, msg string, keysAndValues ...interface{}) {
39 kvMap := make(map[string]interface{}, len(keysAndValues)/2+2)
40
41 kvMap[KeyTimestamp] = time.Now().UnixNano()
42 kvMap[KeyMessage] = msg
43
44 for i := 0; i < len(keysAndValues); i += 2 {
45 kvMap[keysAndValues[i].(string)] = keysAndValues[i+1]
46 }
47
48 sink.encMu.Lock()
49 defer sink.encMu.Unlock()
50
51 _ = sink.enc.Encode(kvMap)
52 }
53
54
55 func (sink *IOSink) Error(err error, msg string, kv ...interface{}) {
56 kv = append(kv, KeyError, err.Error())
57 sink.Info(0, msg, kv...)
58 }
59
View as plain text