43 lines
989 B
Go
43 lines
989 B
Go
|
package logger
|
||
|
|
||
|
import (
|
||
|
"log/slog"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/go-chi/chi/v5/middleware"
|
||
|
)
|
||
|
|
||
|
func New(log *slog.Logger) func(next http.Handler) http.Handler {
|
||
|
return func(next http.Handler) http.Handler {
|
||
|
log = log.With(
|
||
|
slog.String("component", "midddleware/logger"),
|
||
|
)
|
||
|
|
||
|
log.Info("logger middleware enabled")
|
||
|
|
||
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
||
|
entry := log.With(
|
||
|
slog.String("method", r.Method),
|
||
|
slog.String("path", r.URL.Path),
|
||
|
slog.String("remote_addr", r.RemoteAddr),
|
||
|
slog.String("user_agent", r.UserAgent()),
|
||
|
slog.String("request_id", middleware.GetReqID(r.Context())),
|
||
|
)
|
||
|
ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor)
|
||
|
|
||
|
t1 := time.Now()
|
||
|
defer func() {
|
||
|
entry.Info("request completed",
|
||
|
slog.Int("status", ww.Status()),
|
||
|
slog.Int("bytes", ww.BytesWritten()),
|
||
|
slog.String("duration", time.Since(t1).String()),
|
||
|
)
|
||
|
}()
|
||
|
|
||
|
next.ServeHTTP(ww, r)
|
||
|
}
|
||
|
return http.HandlerFunc(fn)
|
||
|
}
|
||
|
}
|