/
encoder.go
85 lines (75 loc) · 2.07 KB
/
encoder.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Package logger implements a new logger based on the zap lib.
package logger
import (
"go.uber.org/zap/buffer"
"go.uber.org/zap/zapcore"
)
// GELFEncoder is a gelf encoder.
// It will use an underlying json encoder to encode entries to the gelf format.
// See http://docs.graylog.org/en/2.4/pages/gelf.html.
type GELFEncoder struct {
zapcore.Encoder
}
// Clone implements the encoder interface.
func (e GELFEncoder) Clone() zapcore.Encoder {
return &GELFEncoder{e.Encoder.Clone()}
}
// EncodeEntry escape the keys following the gelf spec, then the underlying encoder will encode the entry.
func (e GELFEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) {
for i, f := range fields {
fields[i].Key = escapeKey(f.Key)
}
return e.Encoder.EncodeEntry(entry, fields)
}
// NewGELFEncoder instanciate a new GELFEncoder.
func NewGELFEncoder() *GELFEncoder {
return &GELFEncoder{
zapcore.NewJSONEncoder(zapcore.EncoderConfig{
TimeKey: "timestamp",
NameKey: "_logger",
LevelKey: "level",
CallerKey: "_caller",
MessageKey: "short_message",
StacktraceKey: "full_message",
LineEnding: zapcore.DefaultLineEnding,
EncodeName: zapcore.FullNameEncoder,
EncodeTime: zapcore.EpochTimeEncoder,
EncodeLevel: levelEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
}),
}
}
func escapeKey(key string) string {
switch key {
case "id":
return "__id"
case "version", "host", "short_message", "full_message", "timestamp", "level":
return key
}
if len(key) == 0 {
return "_"
}
if key[0] == '_' {
return key
}
return "_" + key
}
func levelEncoder(l zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
switch l {
case zapcore.DebugLevel:
enc.AppendInt(7)
case zapcore.InfoLevel:
enc.AppendInt(6)
case zapcore.WarnLevel:
enc.AppendInt(4)
case zapcore.ErrorLevel:
enc.AppendInt(3)
case zapcore.DPanicLevel:
enc.AppendInt(0)
case zapcore.PanicLevel:
enc.AppendInt(0)
case zapcore.FatalLevel:
enc.AppendInt(0)
}
}