41 lines
944 B
Go
41 lines
944 B
Go
package main
|
|
|
|
import "net/http"
|
|
import "time"
|
|
import "fmt"
|
|
|
|
func runLogging(logs chan string) {
|
|
for log := range logs {
|
|
fmt.Println(log)
|
|
}
|
|
}
|
|
|
|
func wrapLogging(f http.HandlerFunc) http.HandlerFunc {
|
|
logs := make(chan string, 10000)
|
|
go runLogging(logs)
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
start := time.Now()
|
|
f(w, r)
|
|
method := r.Method
|
|
path := r.URL.Path
|
|
elapsed := float64(time.Since(start)) / 1000000.0
|
|
logs <- fmt.Sprintf(
|
|
"method=%s path=%s elapsed=%f",
|
|
method, path, elapsed)
|
|
}
|
|
}
|
|
|
|
func hello(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "text/plain")
|
|
time.Sleep(time.Millisecond * 50)
|
|
fmt.Fprintln(w, "Hello logged world")
|
|
}
|
|
|
|
func main() {
|
|
handler := wrapLogging(hello)
|
|
http.HandleFunc("/", handler)
|
|
http.ListenAndServe(":5000", nil)
|
|
}
|
|
|
|
// todo: logging status code?
|