-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjson_encoder.go
More file actions
87 lines (74 loc) · 2.15 KB
/
json_encoder.go
File metadata and controls
87 lines (74 loc) · 2.15 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
// Copyright (c) 2019-2023 Vincent Cheung (coolingfall@gmail.com).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package lork
import (
"bytes"
"sync"
)
// jsonEncoder encodes logging event into json format.
type jsonEncoder struct {
locker sync.Mutex
buf *bytes.Buffer
tsBuf *bytes.Buffer
}
// NewJsonEncoder creates a new instance of encoder to encode data to json.
func NewJsonEncoder() Encoder {
return &jsonEncoder{
buf: new(bytes.Buffer),
tsBuf: new(bytes.Buffer),
}
}
func (je *jsonEncoder) Encode(e *LogEvent) ([]byte, error) {
je.locker.Lock()
defer je.locker.Unlock()
var err error
bufData := je.tsBuf.Bytes()
bufData, err = appendFormatUnix(bufData, e.Timestamp(), TimeFormatRFC3339)
if err != nil {
return nil, err
}
je.tsBuf.Reset()
je.tsBuf.Write(bufData)
timestamp := je.tsBuf.Bytes()
je.tsBuf.Reset()
// write key and value as json string
je.buf.WriteString("{")
je.writeKeyAndValue(TimestampFieldKey, timestamp, true)
je.writeKeyAndValue(LevelFieldKey, e.Level(), true)
je.writeKeyAndValue(LoggerNameFieldKey, e.LoggerName(), true)
je.writeKeyAndValue(MessageFieldKey, e.Message(), true)
_ = e.Fields(func(k, v []byte, isString bool) error {
je.writeKeyAndValue(string(k), v, isString)
return nil
})
je.buf.Truncate(je.buf.Len() - 1)
je.buf.WriteString("}\n")
p := je.buf.Bytes()
je.buf.Reset()
return p, err
}
func (je *jsonEncoder) writeKeyAndValue(key string, value []byte, isString bool) {
je.buf.WriteByte('"')
je.buf.WriteString(key)
je.buf.WriteByte('"')
je.buf.WriteByte(':')
if isString {
je.buf.WriteByte('"')
}
je.buf.Write(value)
if isString {
je.buf.WriteByte('"')
}
je.buf.WriteByte(',')
}