这是我最初的golang代码:
package main
import (
"net/http"
"io"
)
const hello = `hello world`
func helloHandler(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, hello)
}
func main() {
http.HandleFunc("/", helloHandler)
http.ListenAndServe(":1088", nil)
}
它是一个简单的http服务器,我需要添加新功能,每个get请求都在linux终端ip,METHOD,/ request打印。
终端需要的示例输出:
95.250.33.36 GET /
95.250.33.36 GET /favicon.ico
95.250.33.36 GET /robots.txt
我怎么能这样做?
答案 0 :(得分:2)
关于Golang的最好的事情是接口。
您的helloHandler
实际上实现了HandlerFunc
接口。
使用Open/Close Principle我们可以使用helloHandler
并对其进行扩展,以便按以下方式记录请求:
func wrapHandlerWithLogging(wrappedHandler http.Handler) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
log.Printf("--> %s %s", req.Method, req.URL.Path)
wrappedHandler.ServeHTTP(w, req)
})
}
func main() {
...
http.HandleFunc("/", wrapHandlerWithLogging(http.HandlerFunc(helloHandler)))
...
}
所以基本上,我们用helloHandler
包裹HandlerFunc
和另一个HandlerFunc
。
在这个例子中,我们只记录请求方法(GET,POST,PUT等)和请求路径(例如'/')。但是,您可以记录其他数据:
req.RemoteAddr
网络地址req.Proto
协议版req.Host
指定寻求网址的主机