58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
|
|
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])
|
||
|
|
})
|
||
|
|
}
|