json.在Go中解码TCP连接并同时记录原始数据



我正在使用json.Decodernet.Conn解码为自定义结构。我也想记录在net.Conn上发送的原始JSON字符串,而不修改它

我正在寻找一种有效的方法来实现这一点。我目前有以下代码:

reader := bufio.NewReader(conn)   // conn is a net.Conn
dec := json.NewDecoder(reader)
for {   
// How can I also log the original data before decoding it into the struct?
var dst customStruct
if err = dec.Decode(&dst); err == io.EOF {
break
} else if err != nil {
log.Errorf("failed to decode message: %s", err)
break
}
// do something with dst...
}

使用iotest。NewReadLogger在读取数据时记录数据:

prefix := fmt.Sprintf("%p:", conn)
reader := bufio.NewReader(iotest.NewReadLogger(prefix, conn)) 
dec := json.NewDecoder(reader)
for {   
var dst customStruct
if err = dec.Decode(&dst); err == io.EOF {
break
} else if err != nil {
log.Errorf("failed to decode message: %s", err)
break
}
// do something with dst...
}

如果读取记录器输出与您的喜好不匹配,则复制实现并根据需要进行调整。实现非常简单。

您可以使用ioutil.ReadAll(),然后打印和解码字节。但是,由于您在不使用缓冲区的情况下读取所有字节,因此理想情况下应该将其放在debug标志检查之后。

bs,err := ioutil.ReadAll()
if err != nil {
panic(err)
}
log.Printf("output: %s", string(bs))
var dst customStruct
if err := json.Unmarshal(bs, &dst); err != nil {
panic(err)
}

相关内容

  • 没有找到相关文章

最新更新