2 回答

TA貢獻1811條經驗 獲得超6個贊
使用扎普。任何
帶有 json 的內容。原始消息
。您可以直接轉換 的字節輸出:jsonpb.Marshaler
foo := &pb.FooMsg{
Foo: "blah",
Bar: 1,
}
m := jsonpb.Marshaler{}
var buf bytes.Buffer
if err := m.Marshal(&buf, foo); err != nil {
// handle error
}
logger, _ := zap.NewDevelopment()
logger.Info("Event persisted", zap.Any("event", json.RawMessage(buf.Bytes())))
字節將打印為:
事件持久 {“事件”: {“foo”:“blah”,“bar”:“1”}}'
我相信這是最簡單的方法,但是我也知道一個包卡澤古蘇里/go-proto-zap-marshaler(我不隸屬于它),它生成實現作為原型插件。您可能也想看看。MarshalLogObject()

TA貢獻1848條經驗 獲得超6個贊
我使用了另一種方法來 json 化原型。
由于原型可以自然地封送,我只是將它們包裝在嚴格到json的封送處理器中。
您可以修改內部結構以使用原型(較新的 jsonpb)。
與上一個解決方案中的封送處理器不同,此封送處理程序不需要預先記錄處理。
type jsonObjectMarshaler struct {
obj any
}
func (j *jsonObjectMarshaler) MarshalJSON() ([]byte, error) {
bytes, err := json.Marshal(j.obj)
// bytes, err := protojson.Marshal(j.obj)
if err != nil {
return nil, fmt.Errorf("json marshaling failed: %w", err)
}
return bytes, nil
}
func ZapJsonable(key string, obj any) zap.Field {
return zap.Reflect(key, &jsonObjectMarshaler{obj: obj})
}
然后使用它,只是
logger, _ := zap.NewDevelopment()
logger.Info("Event persisted", ZapJsonable("event", buf))
- 2 回答
- 0 關注
- 219 瀏覽
添加回答
舉報