annotate vendor/github.com/sirupsen/logrus/text_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 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "os"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 "runtime"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 "sort"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 "strconv"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 "sync"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "time"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 "unicode/utf8"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 red = 31
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 yellow = 33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 blue = 36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 gray = 37
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 var baseTimestamp time.Time
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 func init() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 baseTimestamp = time.Now()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 // TextFormatter formats logs into text
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 type TextFormatter struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 // Set to true to bypass checking for a TTY before outputting colors.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 ForceColors bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 // Force disabling colors.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 DisableColors bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 // Force quoting of all values
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 ForceQuote bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 // DisableQuote disables quoting for all values.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 // DisableQuote will have a lower priority than ForceQuote.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 // If both of them are set to true, quote will be forced on all values.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 DisableQuote bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 // Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 EnvironmentOverrideColors bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 // Disable timestamp logging. useful when output is redirected to logging
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 // system that already adds timestamps.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 DisableTimestamp bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 // Enable logging the full timestamp when a TTY is attached instead of just
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 // the time passed since beginning of execution.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 FullTimestamp bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 // TimestampFormat to use for display when a full timestamp is printed.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 // 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
58 // library.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 // The standard Library already provides a set of predefined format.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 TimestampFormat string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 // The fields are sorted by default for a consistent output. For applications
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 // that log extremely frequently and don't use the JSON formatter this may not
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 // be desired.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 DisableSorting bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 // The keys sorting function, when uninitialized it uses sort.Strings.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 SortingFunc func([]string)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 // Disables the truncation of the level text to 4 characters.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 DisableLevelTruncation bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 // PadLevelText Adds padding the level text so that all the levels output at the same length
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 // PadLevelText is a superset of the DisableLevelTruncation option
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 PadLevelText bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 // QuoteEmptyFields will wrap empty fields in quotes if true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 QuoteEmptyFields bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 // Whether the logger's out is to a terminal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 isTerminal bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 // FieldMap allows users to customize the names of keys for default fields.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 // As an example:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 // formatter := &TextFormatter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 // FieldMap: FieldMap{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 // FieldKeyTime: "@timestamp",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 // FieldKeyLevel: "@level",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 // FieldKeyMsg: "@message"}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 FieldMap FieldMap
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 // CallerPrettyfier can be set by the user to modify the content
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 // of the function and file keys in the data when ReportCaller is
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 // activated. If any of the returned value is the empty string the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 // corresponding key will be removed from fields.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 CallerPrettyfier func(*runtime.Frame) (function string, file string)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 terminalInitOnce sync.Once
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 // The max length of the level text, generated dynamically on init
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 levelTextMaxLength int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 func (f *TextFormatter) init(entry *Entry) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 if entry.Logger != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 f.isTerminal = checkIfTerminal(entry.Logger.Out)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 // Get the max length of the level text
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 for _, level := range AllLevels {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 levelTextLength := utf8.RuneCount([]byte(level.String()))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 if levelTextLength > f.levelTextMaxLength {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 f.levelTextMaxLength = levelTextLength
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 func (f *TextFormatter) isColored() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 isColored := f.ForceColors || (f.isTerminal && (runtime.GOOS != "windows"))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 if f.EnvironmentOverrideColors {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 switch force, ok := os.LookupEnv("CLICOLOR_FORCE"); {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 case ok && force != "0":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 isColored = true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 case ok && force == "0", os.Getenv("CLICOLOR") == "0":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 isColored = false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 return isColored && !f.DisableColors
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 // Format renders a single log entry
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 data := make(Fields)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 for k, v := range entry.Data {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 data[k] = v
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 prefixFieldClashes(data, f.FieldMap, entry.HasCaller())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 keys := make([]string, 0, len(data))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 for k := range data {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 keys = append(keys, k)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 var funcVal, fileVal string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 fixedKeys := make([]string, 0, 4+len(data))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 if !f.DisableTimestamp {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLevel))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 if entry.Message != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyMsg))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 if entry.err != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLogrusError))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 if entry.HasCaller() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 if f.CallerPrettyfier != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 funcVal = entry.Caller.Function
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 fileVal = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 if funcVal != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyFunc))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 if fileVal != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyFile))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 if !f.DisableSorting {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 if f.SortingFunc == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 sort.Strings(keys)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 fixedKeys = append(fixedKeys, keys...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 if !f.isColored() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 fixedKeys = append(fixedKeys, keys...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 f.SortingFunc(fixedKeys)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 f.SortingFunc(keys)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 fixedKeys = append(fixedKeys, keys...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 var b *bytes.Buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 if entry.Buffer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 b = entry.Buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 b = &bytes.Buffer{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 f.terminalInitOnce.Do(func() { f.init(entry) })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198 timestampFormat := f.TimestampFormat
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 if timestampFormat == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 timestampFormat = defaultTimestampFormat
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 if f.isColored() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 f.printColored(b, entry, keys, data, timestampFormat)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 for _, key := range fixedKeys {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 var value interface{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 switch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 case key == f.FieldMap.resolve(FieldKeyTime):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 value = entry.Time.Format(timestampFormat)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 case key == f.FieldMap.resolve(FieldKeyLevel):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 value = entry.Level.String()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 case key == f.FieldMap.resolve(FieldKeyMsg):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 value = entry.Message
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 case key == f.FieldMap.resolve(FieldKeyLogrusError):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 value = entry.err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 case key == f.FieldMap.resolve(FieldKeyFunc) && entry.HasCaller():
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 value = funcVal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 case key == f.FieldMap.resolve(FieldKeyFile) && entry.HasCaller():
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 value = fileVal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 value = data[key]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 f.appendKeyValue(b, key, value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 b.WriteByte('\n')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 return b.Bytes(), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, data Fields, timestampFormat string) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 var levelColor int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 switch entry.Level {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 case DebugLevel, TraceLevel:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 levelColor = gray
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 case WarnLevel:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 levelColor = yellow
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 case ErrorLevel, FatalLevel, PanicLevel:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 levelColor = red
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 case InfoLevel:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 levelColor = blue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 levelColor = blue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 levelText := strings.ToUpper(entry.Level.String())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 if !f.DisableLevelTruncation && !f.PadLevelText {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 levelText = levelText[0:4]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 if f.PadLevelText {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252 // Generates the format string used in the next line, for example "%-6s" or "%-7s".
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 // Based on the max level text length.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 formatString := "%-" + strconv.Itoa(f.levelTextMaxLength) + "s"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 // Formats the level text by appending spaces up to the max length, for example:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 // - "INFO "
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 // - "WARNING"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 levelText = fmt.Sprintf(formatString, levelText)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 // Remove a single newline if it already exists in the message to keep
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 // the behavior of logrus text_formatter the same as the stdlib log package
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 entry.Message = strings.TrimSuffix(entry.Message, "\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 caller := ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 if entry.HasCaller() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 funcVal := fmt.Sprintf("%s()", entry.Caller.Function)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 fileVal := fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 if f.CallerPrettyfier != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 if fileVal == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 caller = funcVal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 } else if funcVal == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 caller = fileVal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 caller = fileVal + " " + funcVal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 switch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 case f.DisableTimestamp:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m%s %-44s ", levelColor, levelText, caller, entry.Message)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286 case !f.FullTimestamp:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d]%s %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), caller, entry.Message)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s]%s %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), caller, entry.Message)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 for _, k := range keys {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292 v := data[k]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293 fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 f.appendValue(b, v)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298 func (f *TextFormatter) needsQuoting(text string) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299 if f.ForceQuote {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302 if f.QuoteEmptyFields && len(text) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305 if f.DisableQuote {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308 for _, ch := range text {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309 if !((ch >= 'a' && ch <= 'z') ||
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 (ch >= 'A' && ch <= 'Z') ||
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311 (ch >= '0' && ch <= '9') ||
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312 ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319 func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 if b.Len() > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321 b.WriteByte(' ')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 b.WriteString(key)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324 b.WriteByte('=')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325 f.appendValue(b, value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329 stringVal, ok := value.(string)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331 stringVal = fmt.Sprint(value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 if !f.needsQuoting(stringVal) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335 b.WriteString(stringVal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337 b.WriteString(fmt.Sprintf("%q", stringVal))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 }