Golang:从http.ResponseWriter获取数据以进行日志记录

时间:2017-05-05 09:52:07

标签: go

我不知道这个问题是否有意义,但我想知道是否有办法获取用table.on( 'deselect', function ( e, dt, type, indexes ) {}); table.on( 'select', function ( e, dt, type, indexes ) {}); 写的数据。我需要http.ResponseWriter

我在Golang写了一个api。

logging

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上的数据,然后我可以创建单个有意义的日志。

The aim is to create a single log with request and response data如果没有,请建议我如何实现这一目标。

2 个答案:

答案 0 :(得分:6)

您可以使用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
    }
    ...
}

现在您在rspw中都有log中写入的信息的副本,您可以将log缓冲区的内容保存到显示它的光盘上控制台等。

您可以使用io.TeeReader创建一个Reader,该Reader向给定的Writer写入从给定读者读取的内容 - 这样您就可以将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缓冲区。

答案 1 :(得分:0)

添加到接受的答案。

我喜欢使用io.MultiWriter,但是它仅在此上下文中编写响应正文。

如果需要标题,请像这样使用.Headers().Write函数...

func (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

    // get the response headers
    w.Header().Write(&log)

    err := json.NewDecoder(req.Body).Decode(&requestData)
    if err != nil {
        writeError(rsp, "JSON request is not in correct format")
        return
    }
    ...
}