// Logger is a middleware that logs the start and end of each request, along // with some useful data about what was requested, what the response status was, // and how long it took to return. When standard output is a TTY, Logger will // print in color, otherwise it will print in black and white. // // Logger prints a request ID if one is provided. // // Logger has been designed explicitly to be Good Enough for use in small // applications and for people just getting started with Goji. It is expected // that applications will eventually outgrow this middleware and replace it with // a custom request logger, such as one that produces machine-parseable output, // outputs logs to a different service (e.g., syslog), or formats lines like // those printed elsewhere in the application. func Logger(c *web.C, h http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { reqID := GetReqID(*c) printStart(reqID, r) lw := mutil.WrapWriter(w) t1 := time.Now() h.ServeHTTP(lw, r) if lw.Status() == 0 { lw.WriteHeader(http.StatusOK) } t2 := time.Now() printEnd(reqID, lw, t2.Sub(t1)) } return http.HandlerFunc(fn) }
// NewHTTPLogger returns an HTTPLogger, suitable for use as http middleware. func NewHTTPLogger(system string) func(h http.Handler) http.Handler { middleware := func(h http.Handler) http.Handler { entry := logrus.WithFields(logrus.Fields{ "system": system, }) fn := func(w http.ResponseWriter, r *http.Request) { lw := mutil.WrapWriter(w) entry.WithFields(logrus.Fields{ "uri": r.URL.String(), "method": r.Method, "remote": r.RemoteAddr, }).Info("Beginning request processing") t1 := time.Now() h.ServeHTTP(lw, r) if lw.Status() == 0 { lw.WriteHeader(http.StatusOK) } entry.WithFields(logrus.Fields{ "status": lw.Status(), "uri": r.URL.String(), "method": r.Method, "remote": r.RemoteAddr, "wall": time.Now().Sub(t1).String(), }).Info("Request processing complete") } return http.HandlerFunc(fn) } return middleware }