package middleware import ( "log" "net/http" "time" ) type responseWriter struct { http.ResponseWriter statusCode int written int64 } func (rw *responseWriter) WriteHeader(code int) { rw.statusCode = code rw.ResponseWriter.WriteHeader(code) } func (rw *responseWriter) Write(b []byte) (int, error) { n, err := rw.ResponseWriter.Write(b) rw.written += int64(n) return n, err } func LoggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() wrapped := &responseWriter{ ResponseWriter: w, statusCode: http.StatusOK, } next.ServeHTTP(wrapped, r) duration := time.Since(start) log.Printf( "%s %s %d %s %s", r.Method, r.RequestURI, wrapped.statusCode, duration, r.RemoteAddr, ) }) }