49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
package middleware
|
|
|
|
import (
|
|
"log/slog"
|
|
"net/http"
|
|
"time"
|
|
|
|
"go.neonxp.ru/mux"
|
|
)
|
|
|
|
type wrappedResponse struct {
|
|
http.ResponseWriter
|
|
statusCode int
|
|
}
|
|
|
|
func (w *wrappedResponse) WriteHeader(code int) {
|
|
w.statusCode = code
|
|
w.ResponseWriter.WriteHeader(code)
|
|
}
|
|
|
|
func Logger(logger *slog.Logger) mux.Middleware {
|
|
return func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
requestID := GetRequestID(r)
|
|
args := []any{
|
|
slog.String("proto", r.Proto),
|
|
slog.String("method", r.Method),
|
|
slog.String("request_uri", r.RequestURI),
|
|
slog.String("request_id", requestID),
|
|
}
|
|
logger.InfoContext(
|
|
r.Context(),
|
|
"start request",
|
|
args...,
|
|
)
|
|
t := time.Now()
|
|
wr := &wrappedResponse{ResponseWriter: w, statusCode: http.StatusOK}
|
|
next.ServeHTTP(wr, r)
|
|
args = append(args, slog.String("response_time", time.Since(t).String()))
|
|
args = append(args, slog.Int("response_status", wr.statusCode))
|
|
logger.InfoContext(
|
|
r.Context(),
|
|
"finish request",
|
|
args...,
|
|
)
|
|
})
|
|
}
|
|
}
|