annotate vendor/github.com/sirupsen/logrus/json_formatter.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package logrus
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "bytes"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "encoding/json"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 "runtime"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 type fieldKey string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 // FieldMap allows customization of the key names for default fields.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 type FieldMap map[fieldKey]string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 func (f FieldMap) resolve(key fieldKey) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 if k, ok := f[key]; ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 return k
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 return string(key)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 // JSONFormatter formats logs into parsable json
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 type JSONFormatter struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 // TimestampFormat sets the format used for marshaling timestamps.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 // The format to use is the same than for time.Format or time.Parse from the standard
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 // library.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 // The standard Library already provides a set of predefined format.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 TimestampFormat string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 // DisableTimestamp allows disabling automatic timestamps in output
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 DisableTimestamp bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 // DisableHTMLEscape allows disabling html escaping in output
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 DisableHTMLEscape bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 // DataKey allows users to put all the log entry parameters into a nested dictionary at a given key.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 DataKey string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 // FieldMap allows users to customize the names of keys for default fields.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 // As an example:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 // formatter := &JSONFormatter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 // FieldMap: FieldMap{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 // FieldKeyTime: "@timestamp",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 // FieldKeyLevel: "@level",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 // FieldKeyMsg: "@message",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 // FieldKeyFunc: "@caller",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 // },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 // }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 FieldMap FieldMap
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 // CallerPrettyfier can be set by the user to modify the content
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 // of the function and file keys in the json data when ReportCaller is
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 // activated. If any of the returned value is the empty string the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 // corresponding key will be removed from json fields.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 CallerPrettyfier func(*runtime.Frame) (function string, file string)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 // PrettyPrint will indent all json logs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 PrettyPrint bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 // Format renders a single log entry
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 data := make(Fields, len(entry.Data)+4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 for k, v := range entry.Data {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 switch v := v.(type) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 case error:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 // Otherwise errors are ignored by `encoding/json`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 // https://github.com/sirupsen/logrus/issues/137
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 data[k] = v.Error()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 data[k] = v
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 if f.DataKey != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 newData := make(Fields, 4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 newData[f.DataKey] = data
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 data = newData
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 prefixFieldClashes(data, f.FieldMap, entry.HasCaller())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 timestampFormat := f.TimestampFormat
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 if timestampFormat == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 timestampFormat = defaultTimestampFormat
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 if entry.err != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 data[f.FieldMap.resolve(FieldKeyLogrusError)] = entry.err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 if !f.DisableTimestamp {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 if entry.HasCaller() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 funcVal := entry.Caller.Function
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 fileVal := fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 if f.CallerPrettyfier != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 if funcVal != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 data[f.FieldMap.resolve(FieldKeyFunc)] = funcVal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 if fileVal != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 data[f.FieldMap.resolve(FieldKeyFile)] = fileVal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 var b *bytes.Buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 if entry.Buffer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 b = entry.Buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 b = &bytes.Buffer{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 encoder := json.NewEncoder(b)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 encoder.SetEscapeHTML(!f.DisableHTMLEscape)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 if f.PrettyPrint {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 encoder.SetIndent("", " ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 if err := encoder.Encode(data); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 return nil, fmt.Errorf("failed to marshal fields to JSON, %w", err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 return b.Bytes(), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 }