package middleware import ( "net/http" "time" "git.okseby.com/okseby/playground-go/logger" ) // ANSI color codes const ( ColorReset = "\033[0m" ColorRed = "\033[31m" ColorGreen = "\033[32m" ColorYellow = "\033[33m" ColorCyan = "\033[36m" ColorGrey = "\033[90m" ) type statusRecorder struct { http.ResponseWriter status int } func (r *statusRecorder) WriteHeader(code int) { r.status = code r.ResponseWriter.WriteHeader(code) } func Logger(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() recorder := &statusRecorder{ResponseWriter: w, status: 200} next.ServeHTTP(recorder, r) duration := time.Since(start) statusColor := ColorGreen switch { case recorder.status >= 500: statusColor = ColorRed case recorder.status >= 400: statusColor = ColorRed case recorder.status >= 300: statusColor = ColorYellow } logger.Info("%s%-7s%s %s%-30s%s %s%d%s [%s]", ColorCyan, r.Method, ColorReset, ColorGrey, r.URL.Path, ColorReset, statusColor, recorder.status, ColorReset, duration.Round(time.Millisecond), ) }) }