Middleware, который оборачивает ResponseWriter, записывает время до/после, метод, путь, статус код, длительность. Пример: start := time.Now(), next.ServeHTTP(wrappedWriter, r), log.Printf("%s %s %d %v", r.Method, r.URL.Path, wrappedWriter.statusCode, time.Since(start)). Для wrapping ResponseWriter нужна структура с полем statusCode, переопределяющая WriteHeader. Используй structured logging (slog, zerolog) — потом удобнее фильтровать и анализировать.