Middleware in Echo allows us to intercept requests before they reach handlers, making it a great place to add logging. Echo provides a built-in logging middleware (middleware.Logger()) but for more control, we can create a custom middleware:
package main
import (
	"log"
	"time"
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)
// Custom logging middleware
func requestLogger(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		start := time.Now()
		req := c.Request()
		log.Printf("Request: method=%s, path=%s, remote=%s", req.Method, req.URL.Path, req.RemoteAddr)
		err := next(c)
		res := c.Response()
		log.Printf("Response: status=%d, duration=%s", res.Status, time.Since(start))
		return err
	}
}
func main() {
	e := echo.New()
	// Use Echo's default logger middleware
	e.Use(middleware.Logger())
	// Use custom logging middleware
	e.Use(requestLogger)
	e.GET("/", func(c echo.Context) error {
		return c.String(200, "Hello, Echo!")
	})
	e.Start(":8080")
}