gpt4 book ai didi

go - 如何从 http.ResponseWriter 获取数据以进行日志记录

转载 作者:IT老高 更新时间:2023-10-28 13:10:42 28 4
gpt4 key购买 nike

我不知道这个问题是否有意义,但我想知道是否有任何方法可以获取用 http.ResponseWriter 编写的数据。我需要它来记录日志。

我在 Go 中编写了一个 API。

func api1(w http.ResponseWriter, req *http.Request) {       
var requestData MyStruct
err := json.NewDecoder(req.Body).Decode(&requestData)
if err != nil {
writeError(w, "JSON request is not in correct format")
return
}
log.Println(" Request Data :", req.Body) // I am logging req
result, err := compute() // getting result from a function

if err != nil {
errRes := ErrorResponse{"ERROR", err}
response, er = json.Marshal(errRes) // getting error response
} else {
response, er = json.Marshal(result)
}
if er != nil {
http.Error(w, er.Error(), 500) // writing error
return
}
io.WriteString(w, string(response)) // writing response
}

目的是创建包含请求和响应数据的单个日志。响应可以是错误响应或已处理响应。

我在想如果我能得到写在 http.ResponseWriter 上的数据,那么我可以创建一个有意义的日志。

这可能吗?如果没有,请建议我该如何实现。

最佳答案

您可以使用 io.MultiWriter - 它创建一个写入器,将其写入复制到所有提供的写入器。所以要记录响应

func api1(w http.ResponseWriter, req *http.Request) {
var log bytes.Buffer
rsp := io.MultiWriter(w, &log)
// from this point on use rsp instead of w, ie
err := json.NewDecoder(req.Body).Decode(&requestData)
if err != nil {
writeError(rsp, "JSON request is not in correct format")
return
}
...
}

现在您在 wlog 中都有写入 rsp 的信息的副本,您可以保存 的内容记录缓冲区到磁盘上显示它在控制台等。

您可以使用 io.TeeReader创建一个读取器,将它从给定读取器读取的内容写入给定的写入器 - 这将允许您将 req.Body 的副本保存到日志中,即

func api1(w http.ResponseWriter, req *http.Request) {
var log bytes.Buffer
tee := io.TeeReader(req.Body, &log)
err := json.NewDecoder(tee).Decode(&requestData)
...
}

现在由于 json 解码器从 tee 中读取,req.Body 的内容也被复制到 log 缓冲区中。

关于go - 如何从 http.ResponseWriter 获取数据以进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801849/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com