1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package zapcore
22
23 import (
24 "encoding/json"
25 "io"
26 "time"
27
28 "go.uber.org/zap/buffer"
29 )
30
31
32
33
34 const DefaultLineEnding = "\n"
35
36
37 const OmitKey = ""
38
39
40
41
42
43 type LevelEncoder func(Level, PrimitiveArrayEncoder)
44
45
46
47 func LowercaseLevelEncoder(l Level, enc PrimitiveArrayEncoder) {
48 enc.AppendString(l.String())
49 }
50
51
52
53 func LowercaseColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) {
54 s, ok := _levelToLowercaseColorString[l]
55 if !ok {
56 s = _unknownLevelColor.Add(l.String())
57 }
58 enc.AppendString(s)
59 }
60
61
62
63 func CapitalLevelEncoder(l Level, enc PrimitiveArrayEncoder) {
64 enc.AppendString(l.CapitalString())
65 }
66
67
68
69 func CapitalColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) {
70 s, ok := _levelToCapitalColorString[l]
71 if !ok {
72 s = _unknownLevelColor.Add(l.CapitalString())
73 }
74 enc.AppendString(s)
75 }
76
77
78
79
80
81 func (e *LevelEncoder) UnmarshalText(text []byte) error {
82 switch string(text) {
83 case "capital":
84 *e = CapitalLevelEncoder
85 case "capitalColor":
86 *e = CapitalColorLevelEncoder
87 case "color":
88 *e = LowercaseColorLevelEncoder
89 default:
90 *e = LowercaseLevelEncoder
91 }
92 return nil
93 }
94
95
96
97
98
99 type TimeEncoder func(time.Time, PrimitiveArrayEncoder)
100
101
102
103 func EpochTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
104 nanos := t.UnixNano()
105 sec := float64(nanos) / float64(time.Second)
106 enc.AppendFloat64(sec)
107 }
108
109
110
111 func EpochMillisTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
112 nanos := t.UnixNano()
113 millis := float64(nanos) / float64(time.Millisecond)
114 enc.AppendFloat64(millis)
115 }
116
117
118
119 func EpochNanosTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
120 enc.AppendInt64(t.UnixNano())
121 }
122
123 func encodeTimeLayout(t time.Time, layout string, enc PrimitiveArrayEncoder) {
124 type appendTimeEncoder interface {
125 AppendTimeLayout(time.Time, string)
126 }
127
128 if enc, ok := enc.(appendTimeEncoder); ok {
129 enc.AppendTimeLayout(t, layout)
130 return
131 }
132
133 enc.AppendString(t.Format(layout))
134 }
135
136
137
138
139
140
141 func ISO8601TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
142 encodeTimeLayout(t, "2006-01-02T15:04:05.000Z0700", enc)
143 }
144
145
146
147
148
149 func RFC3339TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
150 encodeTimeLayout(t, time.RFC3339, enc)
151 }
152
153
154
155
156
157
158 func RFC3339NanoTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
159 encodeTimeLayout(t, time.RFC3339Nano, enc)
160 }
161
162
163
164 func TimeEncoderOfLayout(layout string) TimeEncoder {
165 return func(t time.Time, enc PrimitiveArrayEncoder) {
166 encodeTimeLayout(t, layout, enc)
167 }
168 }
169
170
171
172
173
174
175
176
177 func (e *TimeEncoder) UnmarshalText(text []byte) error {
178 switch string(text) {
179 case "rfc3339nano", "RFC3339Nano":
180 *e = RFC3339NanoTimeEncoder
181 case "rfc3339", "RFC3339":
182 *e = RFC3339TimeEncoder
183 case "iso8601", "ISO8601":
184 *e = ISO8601TimeEncoder
185 case "millis":
186 *e = EpochMillisTimeEncoder
187 case "nanos":
188 *e = EpochNanosTimeEncoder
189 default:
190 *e = EpochTimeEncoder
191 }
192 return nil
193 }
194
195
196
197
198
199
200
201
202
203
204 func (e *TimeEncoder) UnmarshalYAML(unmarshal func(interface{}) error) error {
205 var o struct {
206 Layout string `json:"layout" yaml:"layout"`
207 }
208 if err := unmarshal(&o); err == nil {
209 *e = TimeEncoderOfLayout(o.Layout)
210 return nil
211 }
212
213 var s string
214 if err := unmarshal(&s); err != nil {
215 return err
216 }
217 return e.UnmarshalText([]byte(s))
218 }
219
220
221 func (e *TimeEncoder) UnmarshalJSON(data []byte) error {
222 return e.UnmarshalYAML(func(v interface{}) error {
223 return json.Unmarshal(data, v)
224 })
225 }
226
227
228
229
230
231 type DurationEncoder func(time.Duration, PrimitiveArrayEncoder)
232
233
234 func SecondsDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
235 enc.AppendFloat64(float64(d) / float64(time.Second))
236 }
237
238
239
240 func NanosDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
241 enc.AppendInt64(int64(d))
242 }
243
244
245
246 func MillisDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
247 enc.AppendInt64(d.Nanoseconds() / 1e6)
248 }
249
250
251
252 func StringDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
253 enc.AppendString(d.String())
254 }
255
256
257
258
259 func (e *DurationEncoder) UnmarshalText(text []byte) error {
260 switch string(text) {
261 case "string":
262 *e = StringDurationEncoder
263 case "nanos":
264 *e = NanosDurationEncoder
265 case "ms":
266 *e = MillisDurationEncoder
267 default:
268 *e = SecondsDurationEncoder
269 }
270 return nil
271 }
272
273
274
275
276
277 type CallerEncoder func(EntryCaller, PrimitiveArrayEncoder)
278
279
280
281 func FullCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) {
282
283 enc.AppendString(caller.String())
284 }
285
286
287
288 func ShortCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) {
289
290 enc.AppendString(caller.TrimmedPath())
291 }
292
293
294
295 func (e *CallerEncoder) UnmarshalText(text []byte) error {
296 switch string(text) {
297 case "full":
298 *e = FullCallerEncoder
299 default:
300 *e = ShortCallerEncoder
301 }
302 return nil
303 }
304
305
306
307
308
309
310 type NameEncoder func(string, PrimitiveArrayEncoder)
311
312
313 func FullNameEncoder(loggerName string, enc PrimitiveArrayEncoder) {
314 enc.AppendString(loggerName)
315 }
316
317
318
319 func (e *NameEncoder) UnmarshalText(text []byte) error {
320 switch string(text) {
321 case "full":
322 *e = FullNameEncoder
323 default:
324 *e = FullNameEncoder
325 }
326 return nil
327 }
328
329
330
331 type EncoderConfig struct {
332
333
334 MessageKey string `json:"messageKey" yaml:"messageKey"`
335 LevelKey string `json:"levelKey" yaml:"levelKey"`
336 TimeKey string `json:"timeKey" yaml:"timeKey"`
337 NameKey string `json:"nameKey" yaml:"nameKey"`
338 CallerKey string `json:"callerKey" yaml:"callerKey"`
339 FunctionKey string `json:"functionKey" yaml:"functionKey"`
340 StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"`
341 SkipLineEnding bool `json:"skipLineEnding" yaml:"skipLineEnding"`
342 LineEnding string `json:"lineEnding" yaml:"lineEnding"`
343
344
345
346 EncodeLevel LevelEncoder `json:"levelEncoder" yaml:"levelEncoder"`
347 EncodeTime TimeEncoder `json:"timeEncoder" yaml:"timeEncoder"`
348 EncodeDuration DurationEncoder `json:"durationEncoder" yaml:"durationEncoder"`
349 EncodeCaller CallerEncoder `json:"callerEncoder" yaml:"callerEncoder"`
350
351
352 EncodeName NameEncoder `json:"nameEncoder" yaml:"nameEncoder"`
353
354
355 NewReflectedEncoder func(io.Writer) ReflectedEncoder `json:"-" yaml:"-"`
356
357
358 ConsoleSeparator string `json:"consoleSeparator" yaml:"consoleSeparator"`
359 }
360
361
362
363
364 type ObjectEncoder interface {
365
366 AddArray(key string, marshaler ArrayMarshaler) error
367 AddObject(key string, marshaler ObjectMarshaler) error
368
369
370 AddBinary(key string, value []byte)
371 AddByteString(key string, value []byte)
372 AddBool(key string, value bool)
373 AddComplex128(key string, value complex128)
374 AddComplex64(key string, value complex64)
375 AddDuration(key string, value time.Duration)
376 AddFloat64(key string, value float64)
377 AddFloat32(key string, value float32)
378 AddInt(key string, value int)
379 AddInt64(key string, value int64)
380 AddInt32(key string, value int32)
381 AddInt16(key string, value int16)
382 AddInt8(key string, value int8)
383 AddString(key, value string)
384 AddTime(key string, value time.Time)
385 AddUint(key string, value uint)
386 AddUint64(key string, value uint64)
387 AddUint32(key string, value uint32)
388 AddUint16(key string, value uint16)
389 AddUint8(key string, value uint8)
390 AddUintptr(key string, value uintptr)
391
392
393
394 AddReflected(key string, value interface{}) error
395
396
397
398 OpenNamespace(key string)
399 }
400
401
402
403
404
405 type ArrayEncoder interface {
406
407 PrimitiveArrayEncoder
408
409
410 AppendDuration(time.Duration)
411 AppendTime(time.Time)
412
413
414 AppendArray(ArrayMarshaler) error
415 AppendObject(ObjectMarshaler) error
416
417
418
419 AppendReflected(value interface{}) error
420 }
421
422
423
424
425 type PrimitiveArrayEncoder interface {
426
427 AppendBool(bool)
428 AppendByteString([]byte)
429 AppendComplex128(complex128)
430 AppendComplex64(complex64)
431 AppendFloat64(float64)
432 AppendFloat32(float32)
433 AppendInt(int)
434 AppendInt64(int64)
435 AppendInt32(int32)
436 AppendInt16(int16)
437 AppendInt8(int8)
438 AppendString(string)
439 AppendUint(uint)
440 AppendUint64(uint64)
441 AppendUint32(uint32)
442 AppendUint16(uint16)
443 AppendUint8(uint8)
444 AppendUintptr(uintptr)
445 }
446
447
448
449
450
451
452
453
454
455 type Encoder interface {
456 ObjectEncoder
457
458
459
460 Clone() Encoder
461
462
463
464
465 EncodeEntry(Entry, []Field) (*buffer.Buffer, error)
466 }
467
View as plain text