package main import ( "log" "net/http" "strings" "time" ) type responseWriter struct { http.ResponseWriter status int wroteHeader bool } func (rw *responseWriter) WriteHeader(code int) { if rw.wroteHeader { return } rw.status = code rw.ResponseWriter.WriteHeader(code) rw.wroteHeader = true return } func loghttpreq(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { method := r.Method path := r.URL.EscapedPath() endpoint := strings.Split(r.RemoteAddr, ":") ip := endpoint[0] wrapped := &responseWriter{ ResponseWriter: w, } start := time.Now() next.ServeHTTP(wrapped, r) responseTime := time.Since(start) log.Printf( "%-15v %14v %v %-9v %v", ip, responseTime, wrapped.status, method, path, ) }) }