转到HTTP ListenAndServe日志响应

时间:2016-04-18 23:32:30

标签: go

我想知道在使用ListenAndServe时是否有办法记录响应。

据我所知,处理程序无法访问“Response”对象。只是一个ResponseWriter,所以我不能调用httputil.DumpResponse。

3 个答案:

答案 0 :(得分:4)

http.ResponseWriter是一个界面。您可以使用嵌入来扩展它以进行日志记录,如下所示。

package main
import (
    "log"
    "net/http"
)

func sampleHandler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    response := []byte("Sample Response")
    w.Write(response)
}

type loggingResponseWriter struct {
    status int
    body   string
    http.ResponseWriter
}

func (w *loggingResponseWriter) WriteHeader(code int) {
    w.status = code
    w.ResponseWriter.WriteHeader(code)
}

func (w *loggingResponseWriter) Write(body []byte) (int, error) {
    w.body = string(body)
    return w.ResponseWriter.Write(body)
}

func responseLogger(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        loggingRW := &loggingResponseWriter{
            ResponseWriter: w,
        }
        h.ServeHTTP(loggingRW, r)
        log.Println("Status : ", loggingRW.status, "Response : ", loggingRW.body)
    })
}

func main() {
    http.Handle("/", responseLogger(http.HandlerFunc(sampleHandler)))
    http.ListenAndServe(":8080", nil)
}

您可以使用responseLogger包装要记录响应的处理函数。

答案 1 :(得分:1)

您不能这样做,因为在您将回复写入ResponseWriter之前,技术上的回复并不存在。

但是response只是headerbodyresponse code所以在处理函数中你可以在{{1}上使用方法Header()获取标题,然后您可以在将ResponseWriterresponse code写入body之前对其进行记录。

如果你提供一个你想要做的例子,我可以详细说明如何做。

这是我为一个小项目解决这个问题的方法: 我在所有处理程序中使用它:

ResponseWriter

在处理程序函数结束时,在提供请求的数据之后,我更新了请求和响应的值。

让goroutine听取频道Log并进行所有日志记录。

此外,您可以编写一个包装函数来提供文件并返回响应。

答案 2 :(得分:0)

作为替代方案,可以使用fasthttp。