package log import ( "fmt" "net/http" "strconv" "time" ) type LoggingResponseWriter struct { http.ResponseWriter Status int } var COL_Reset = "\033[0m" var COL_Red = "\033[31m" var COL_Green = "\033[32m" var COL_Yellow = "\033[33m" var COL_Blue = "\033[34m" var COL_Purple = "\033[35m" var COL_Cyan = "\033[36m" var COL_Gray = "\033[37m" var COL_White = "\033[97m" func HTTPLog(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() lrw := LoggingResponseWriter{w, http.StatusOK} next.ServeHTTP(&lrw, r) after := time.Now() difference := (after.Nanosecond() - start.Nanosecond()) / 1_000_000 elapsed := "<1" if difference >= 1 { elapsed = strconv.Itoa(difference) } statusColour := COL_Reset if lrw.Status - 600 <= 0 { statusColour = COL_Red } if lrw.Status - 500 <= 0 { statusColour = COL_Yellow } if lrw.Status - 400 <= 0 { statusColour = COL_White } if lrw.Status - 300 <= 0 { statusColour = COL_Green } fmt.Printf("[%s] %s %s - %s%d%s (%sms) (%s)\n", after.Format(time.UnixDate), r.Method, r.URL.Path, statusColour, lrw.Status, COL_Reset, elapsed, r.Header["User-Agent"][0]) }) }