| 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 {
|
|
|
| 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)
|
| }
|
| }
|
|
|