Skip to content
Snippets Groups Projects
Commit 10626018 authored by Will McCutchen's avatar Will McCutchen
Browse files

Add status code, body size, and request duration to logs

parent 9fb635b7
No related branches found
No related tags found
No related merge requests found
...@@ -27,6 +27,8 @@ func main() { ...@@ -27,6 +27,8 @@ func main() {
flag.DurationVar(&maxDuration, "max-duration", httpbin.DefaultMaxDuration, "Maximum duration a response may take") flag.DurationVar(&maxDuration, "max-duration", httpbin.DefaultMaxDuration, "Maximum duration a response may take")
flag.Parse() flag.Parse()
log.SetFlags(log.Ldate | log.Lmicroseconds | log.LUTC)
// Command line flags take precedence over environment vars, so we only // Command line flags take precedence over environment vars, so we only
// check for environment vars if we have default values for our command // check for environment vars if we have default values for our command
// line flags. // line flags.
...@@ -62,6 +64,6 @@ func main() { ...@@ -62,6 +64,6 @@ func main() {
}) })
listenAddr := net.JoinHostPort("0.0.0.0", strconv.Itoa(port)) listenAddr := net.JoinHostPort("0.0.0.0", strconv.Itoa(port))
log.Printf("listening on port %s", listenAddr) log.Printf("addr=%s", listenAddr)
log.Fatal(http.ListenAndServe(listenAddr, h.Handler())) log.Fatal(http.ListenAndServe(listenAddr, h.Handler()))
} }
...@@ -4,15 +4,9 @@ import ( ...@@ -4,15 +4,9 @@ import (
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
"time"
) )
func logger(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
h.ServeHTTP(w, r)
log.Printf("%s %s %s", r.RemoteAddr, r.Method, r.URL)
})
}
func cors(h http.Handler) http.Handler { func cors(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
origin := r.Header.Get("Origin") origin := r.Header.Get("Origin")
...@@ -56,3 +50,52 @@ func limitRequestSize(maxSize int64, h http.Handler) http.Handler { ...@@ -56,3 +50,52 @@ func limitRequestSize(maxSize int64, h http.Handler) http.Handler {
h.ServeHTTP(w, r) h.ServeHTTP(w, r)
}) })
} }
// metaResponseWriter implements is an http.ResponseWriter and http.Flusher
// that records its status code and body size for logging purposes.
type metaResponseWriter struct {
w http.ResponseWriter
status int
size int
}
func (mw *metaResponseWriter) Write(b []byte) (int, error) {
size, err := mw.w.Write(b)
mw.size += size
return size, err
}
func (mw *metaResponseWriter) WriteHeader(s int) {
mw.w.WriteHeader(s)
mw.status = s
}
func (mw *metaResponseWriter) Flush() {
f := mw.w.(http.Flusher)
f.Flush()
}
func (mw *metaResponseWriter) Header() http.Header {
return mw.w.Header()
}
func (mw *metaResponseWriter) Status() int {
if mw.status == 0 {
return http.StatusOK
}
return mw.status
}
func (mw *metaResponseWriter) Size() int {
return mw.size
}
func logger(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
mw := &metaResponseWriter{w: w}
t := time.Now()
h.ServeHTTP(mw, r)
duration := time.Now().Sub(t)
log.Printf("status=%d method=%s uri=%q size=%d duration=%s", mw.Status(), r.Method, r.URL.RequestURI(), mw.Size(), duration)
})
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment