github.com/hellofresh/janus@v0.0.0-20230925145208-ce8de8183c67/pkg/middleware/logger.go (about) 1 package middleware 2 3 import ( 4 "net/http" 5 "time" 6 7 "github.com/felixge/httpsnoop" 8 "github.com/hellofresh/janus/pkg/observability" 9 log "github.com/sirupsen/logrus" 10 ) 11 12 // Logger struct contains data and logic required for middleware functionality 13 type Logger struct{} 14 15 // NewLogger builds and returns new Logger middleware instance 16 func NewLogger() *Logger { 17 return &Logger{} 18 } 19 20 // Handler implementation 21 func (m *Logger) Handler(handler http.Handler) http.Handler { 22 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 23 log.WithFields(log.Fields{"method": r.Method, "path": r.URL.Path}).Debug("Started request") 24 25 fields := log.Fields{ 26 "request-id": observability.RequestIDFromContext(r.Context()), 27 "method": r.Method, 28 "host": r.Host, 29 "request": r.RequestURI, 30 "remote-addr": r.RemoteAddr, 31 "referer": r.Referer(), 32 "user-agent": r.UserAgent(), 33 } 34 35 m := httpsnoop.CaptureMetrics(handler, w, r) 36 37 fields["code"] = m.Code 38 fields["duration"] = int(m.Duration / time.Millisecond) 39 fields["duration-fmt"] = m.Duration.String() 40 41 log.WithFields(fields).Info("Completed handling request") 42 }) 43 }