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  }