File size: 1,415 Bytes
9853396
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
package log

import (
	"encoding/json"

	"go.uber.org/zap/buffer"
	"go.uber.org/zap/zapcore"
)

type ConsoleJSONEncoder struct {
	zapcore.Encoder

	cfg zapcore.EncoderConfig
}

func NewConsoleJSONEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder {
	if len(cfg.ConsoleSeparator) == 0 {
		// Use a default delimiter of '\t' for backwards compatibility
		cfg.ConsoleSeparator = "\t"
	}

	encoder := zapcore.NewConsoleEncoder(cfg)

	return &ConsoleJSONEncoder{
		Encoder: encoder,
		cfg:     cfg,
	}
}

func (c *ConsoleJSONEncoder) Clone() zapcore.Encoder {
	return &ConsoleJSONEncoder{Encoder: c.Encoder.Clone(), cfg: c.cfg}
}

func (enc *ConsoleJSONEncoder) EncodeEntry(
	ent zapcore.Entry,
	fields []zapcore.Field,
) (*buffer.Buffer, error) {
	line, err := enc.Encoder.EncodeEntry(ent, nil)
	if err != nil {
		return line, err
	}

	if len(fields) == 0 {
		return line, nil
	}

	encoder := zapcore.NewMapObjectEncoder()
	addFields(encoder, fields)

	context, err := json.MarshalIndent(encoder.Fields, "", "  ")
	if err != nil {
		return line, err
	}

	line.AppendString(string(context))

	if enc.cfg.LineEnding != "" {
		line.AppendString(enc.cfg.LineEnding)
	} else {
		line.AppendString(zapcore.DefaultLineEnding)
	}

	return line, nil
}

func addFields(enc ObjectEncoder, fields []Field) {
	for i := range fields {
		fields[i].AddTo(enc)
	}
}