github.com/status-im/status-go@v1.1.0/protocol/zaputil/encoder.go (about)

     1  package zaputil
     2  
     3  import (
     4  	"encoding/hex"
     5  	"sync"
     6  
     7  	"go.uber.org/zap"
     8  	"go.uber.org/zap/zapcore"
     9  )
    10  
    11  type jsonHexEncoder struct {
    12  	zapcore.Encoder
    13  }
    14  
    15  // NewJSONHexEncoder creates a JSON logger based on zapcore.NewJSONEncoder
    16  // but overwrites encoding of byte slices. Instead encoding them with base64,
    17  // jsonHexEncoder uses hex-encoding.
    18  // Each hex-encoded value is prefixed with 0x so that it's clear it's a hex string.
    19  func NewJSONHexEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder {
    20  	jsonEncoder := zapcore.NewJSONEncoder(cfg)
    21  	return &jsonHexEncoder{
    22  		Encoder: jsonEncoder,
    23  	}
    24  }
    25  
    26  func (enc *jsonHexEncoder) AddBinary(key string, val []byte) {
    27  	enc.AddString(key, "0x"+hex.EncodeToString(val))
    28  }
    29  
    30  func (enc *jsonHexEncoder) Clone() zapcore.Encoder {
    31  	encoderClone := enc.Encoder.Clone()
    32  	return &jsonHexEncoder{Encoder: encoderClone}
    33  }
    34  
    35  var (
    36  	registerJSONHexEncoderOnce   sync.Once
    37  	registerConsoleHexEncodeOnce sync.Once
    38  )
    39  
    40  // RegisterJSONHexEncoder registers a jsonHexEncoder under "json-hex" name.
    41  // Later, this name can be used as a value for zap.Config.Encoding to enable
    42  // jsonHexEncoder.
    43  func RegisterJSONHexEncoder() error {
    44  	var err error
    45  	registerJSONHexEncoderOnce.Do(func() {
    46  		err = zap.RegisterEncoder("json-hex", func(cfg zapcore.EncoderConfig) (zapcore.Encoder, error) {
    47  			return NewJSONHexEncoder(cfg), nil
    48  		})
    49  	})
    50  	return err
    51  }
    52  
    53  type consoleHexEncoder struct {
    54  	zapcore.Encoder
    55  }
    56  
    57  func NewConsoleHexEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder {
    58  	consoleEncoder := zapcore.NewConsoleEncoder(cfg)
    59  	return &consoleHexEncoder{
    60  		Encoder: consoleEncoder,
    61  	}
    62  }
    63  
    64  func (enc *consoleHexEncoder) AddBinary(key string, val []byte) {
    65  	enc.AddString(key, "0x"+hex.EncodeToString(val))
    66  }
    67  
    68  func (enc *consoleHexEncoder) Clone() zapcore.Encoder {
    69  	encoderClone := enc.Encoder.Clone()
    70  	return &consoleHexEncoder{Encoder: encoderClone}
    71  }
    72  
    73  func RegisterConsoleHexEncoder() error {
    74  	var err error
    75  	registerConsoleHexEncodeOnce.Do(func() {
    76  		err = zap.RegisterEncoder("console-hex", func(cfg zapcore.EncoderConfig) (zapcore.Encoder, error) {
    77  			return NewConsoleHexEncoder(cfg), nil
    78  		})
    79  	})
    80  	return err
    81  }