记录http响应(除了请求) [英] Logging http responses (in addition to requests)
问题描述
我正在使用Go和Gorilla Web工具包的mux和handler软件包来构建复杂的应用程序,其中一部分需要使用http服务器.Gorilla的mux和handler程序包运行良好,我能够成功启动并运行http服务器,并且记录请求非常简单.
I am using Go and the Gorilla web toolkit's mux and handler packages to build a complex application, part of which requires a http server. Gorilla's mux and handler packages work wonderfully and I am able to successfully get the http server up and running and it has been quite simple to log requests.
但是,我无法确定如何记录响应.理想情况下,我希望有一种类似于Gorilla的LoggingHandler的机制,可以包装"日志机制很容易.
However, I am unable to determine how I may log responses. Ideally, I would like a mechanism, similar to Gorilla's LoggingHandler, that "wraps" the logging mechanism easily.
是否有一个Go包可以轻松包装/记录响应?有没有一种我没有考虑过的以这种方式使用Go或Gorilla的功能的方法?
Is there a Go package that does easily wraps / logs responses? Is there a way to use Go or Gorilla's capabilities in this fashion that I have not considered?
推荐答案
非常感谢.我尝试了一些建议,并找到了一个使用极简包装的简单解决方案.这是对我有用的解决方案(随时提供评论,或者更好的其他解决方案):
Thanks for the great suggestions. I tried a few of the suggestions and landed on a rather simple solution that uses a minimalist wrapper. Here is the solution that worked for me (feel free to offer comments, or better yet, other solutions):
import (
"fmt"
"log"
"net/http"
"net/http/httptest"
"net/http/httputil"
"github.com/gorilla/mux"
)
:
func logHandler(fn http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
x, err := httputil.DumpRequest(r, true)
if err != nil {
http.Error(w, fmt.Sprint(err), http.StatusInternalServerError)
return
}
log.Println(fmt.Sprintf("%q", x))
rec := httptest.NewRecorder()
fn(rec, r)
log.Println(fmt.Sprintf("%q", rec.Body))
}
}
func MessageHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "A message was received")
}
以下代码将使用上述处理程序:
And the following code will use the aforementioned handler:
:
router := mux.NewRouter()
router.HandleFunc("/", logHandler(MessageHandler))
:
以上代码的输出类似于以下内容:
Output from the above code will be something along the lines of:
:
2016/07/20 14:44:29 "GET ... HTTP/1.1\r\nHost: localhost:8088\r\nAccept: */*\r\nUser-Agent: curl/7.43.0\r\n\r\n"
2016/07/20 14:44:29 ...[response body]
:
这篇关于记录http响应(除了请求)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!