restful服务中,通常需要将请求信息记录到日志中。以下例子中展示了go如何实现一个简单的日志中间件。
它的基本原理是将业务函数(本例 foo/bar
)作为参数传递给日志函数(本例 logging
)中,然后将日志函数作为参数交给http.HandleFunc
即可。
package main
import (
"fmt"
"log"
"net/http"
)
func logging(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL.Path)
f(w, r)
}
}
func foo(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "foo")
}
func bar(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "bar")
}
func main() {
http.HandleFunc("/foo", logging(foo))
http.HandleFunc("/bar", logging(bar))
http.ListenAndServe(":8080", nil)
}
每次访问http://localhost:8080/foo
或者http://localhost:8080/bar
,后台都会记录请求的地址
2021/02/28 23:56:41 /bar
2021/02/28 23:56:48 /foo