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 }