Golang 中国

需要对http的body的内容(json格式)进行日志记录,
服务端:请求进入,请求返回的内容,都需要进行详细的日志记录,
看过一些实现方案,是将body的内容读取到buf,写完日志后,再赋值指针回去给body。

那么有没有,不复制body内容,实现日志的方案呢?也就是常说的zerocopy方案?


bigbear 于 2017-11-07 14:06 修改
3 回复
heywap
#1 heywap • 2017-11-03 16:03

问题不是太清楚,不知道你是在做http的客户端,还是http的服务端。
如果是服务端你发送什么样的响应自己是清楚的。

如果是客户端,直接 ioutil.ReadAll(res.Body)
这样就可以了,res 是 *Response,也就是 http.Get的返回结果。

heimeil
#2 heimeil • 2017-11-03 18:54

这个切片避免不了copy了,数据流不能直接使用,你说的这个方案应该是比较合适的解决方案了,在数据流正常读取流程之前切片肯定要全部读完才能使用,再又在内存里模拟成数据流供正常流程读取,这个切片的位置只能这样操作。

如果非要zerocopy的话,可以换一个切片点,在数据读取完后,一般都需要其他处理,比如解析JSON,可以将解析JSON封装成一个方法,再在这个方法内完成切片就行,直接使用已经读取完全的数据。

bigbear
#3 bigbear • 2017-11-07 14:05

日志切面放到body的byte反序列化之后可行,buf的内存想要再节省就很困难了,看来是不行的。
2楼说的正确。

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。