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