package middleware import ( "net/http" "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) func Logger(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() ww := &responseWriter{ResponseWriter: w, status: http.StatusOK} next.ServeHTTP(ww, r) level := zerolog.InfoLevel if ww.status >= 500 { level = zerolog.ErrorLevel } else if ww.status >= 400 { level = zerolog.WarnLevel } log.WithLevel(level). Str("method", r.Method). Str("path", r.URL.Path). Int("status", ww.status). Dur("duration", time.Since(start)). Str("ip", r.RemoteAddr). Msg("") }) } type responseWriter struct { http.ResponseWriter status int } func (rw *responseWriter) WriteHeader(status int) { rw.status = status rw.ResponseWriter.WriteHeader(status) }