目前能做到打印request以及消耗时间,但是无法打印response数据,需要一个解决方法获取reponse里的statusCode和body。
func logReqAndRes(start time.Time, requestData []byte, w http.ResponseWriter, r *http.Request) {
t := time.Now()
elapsed := t.Sub(start)
requestDataArray := strings.Split(string(requestData),"\r\n")
body, _ := url.QueryUnescape(requestDataArray[len(requestDataArray)-1])
log.WithFields(log.Fields{
"request.Url":r.URL.Path,
"request.Query":r.URL.RawQuery,
"request.Host":r.Host,
"request.Method":r.Method,
"request.Header":r.Header,
"request.Body": body,
"duration(ms)": float64(elapsed)/1000000.0,
}).Info("request")
// 但是无法通过w获取response的数据
fmt.Println(w)//这个打印的数据并不是我需要的
}
func Interceptor(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
dumpRequest, _ := httputil.DumpRequest(r, true)
h.ServeHTTP(w, r)
logReqAndRes(start,dumpRequest,w,r)
})
}
func Interceptor(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_w := &YourResponseWriter{
w:w,
r:r,
}
h.ServeHTTP(_w, r)
})
}
YourResponseWriter实现http.ResponseWriter interface,在里面加入你需要的功能
#2
更多评论
我的结论是如果要记录消耗时间,使用interceptor这种方案是无效的。
目前的做法是只记录请求数据和相应数据,请求消耗的时间不做记录。
即在w.write所在的方法里打印log。
func success(w http.ResponseWriter, r *http.Request, message string, data interface{}) {
w.Header().Set("content-type","application/json")
w.WriteHeader(http.StatusOK)
output := make(map[string]interface{})
output["result"] = true
output["message"] = message
output["data"] = data
outputJson, _ := json.Marshal(output)
w.Write(outputJson)
logReqAndRes(output,r)
}
#1