forked from cadey/xesite
37 lines
648 B
Go
37 lines
648 B
Go
|
package ex
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/Xe/ln"
|
||
|
)
|
||
|
|
||
|
func HTTPLog(next http.Handler) http.Handler {
|
||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
host, _, _ := net.SplitHostPort(r.RemoteAddr)
|
||
|
f := ln.F{
|
||
|
"remote_ip": host,
|
||
|
"x_forwarded_for": r.Header.Get("X-Forwarded-For"),
|
||
|
"path": r.URL.Path,
|
||
|
}
|
||
|
ctx := ln.WithF(r.Context(), f)
|
||
|
st := time.Now()
|
||
|
|
||
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||
|
|
||
|
af := time.Now()
|
||
|
f["request_duration"] = af.Sub(st)
|
||
|
|
||
|
ws, ok := w.(interface {
|
||
|
Status() int
|
||
|
})
|
||
|
if ok {
|
||
|
f["status"] = ws.Status()
|
||
|
}
|
||
|
|
||
|
ln.Log(r.Context(), f)
|
||
|
})
|
||
|
}
|