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 关注
- 343 浏览
添加回答
举报
