this repo has no description
1package utility
2
3import (
4 "log/slog"
5 "net/http"
6 "time"
7)
8
9// Logger is an HTTP middleware that logs each request.
10func Logger(next http.Handler) http.Handler {
11 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
12 if !slog.Default().Enabled(r.Context(), slog.LevelInfo) {
13 next.ServeHTTP(w, r)
14 return
15 }
16
17 start := time.Now()
18 rw := &responseWriter{ResponseWriter: w, code: http.StatusOK}
19 next.ServeHTTP(rw, r)
20
21 attrs := []slog.Attr{
22 slog.String("method", r.Method),
23 slog.String("path", r.URL.Path),
24 slog.Int("code", rw.code),
25 slog.String("duration", time.Since(start).String()),
26 slog.String("remote", r.RemoteAddr),
27 }
28
29 slog.LogAttrs(r.Context(), slog.LevelInfo, "http request", attrs...)
30 })
31}
32
33type responseWriter struct {
34 http.ResponseWriter
35 code int
36}
37
38func (rw *responseWriter) WriteHeader(code int) {
39 rw.code = code
40 rw.ResponseWriter.WriteHeader(code)
41}