github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/api/server/handler_logging.go (about) 1 package server 2 3 import ( 4 "io" 5 "io/ioutil" 6 "net/http" 7 "time" 8 9 "github.com/gorilla/mux" 10 "github.com/sirupsen/logrus" 11 ) 12 13 type responseWriter struct { 14 http.ResponseWriter 15 } 16 17 var apiLogger = &logrus.Logger{ 18 Formatter: &logrus.TextFormatter{ 19 DisableColors: true, 20 DisableLevelTruncation: true, 21 FullTimestamp: true, 22 QuoteEmptyFields: true, 23 TimestampFormat: time.RFC3339, 24 }, 25 Level: logrus.TraceLevel, 26 Out: logrus.StandardLogger().Out, 27 } 28 29 func (l responseWriter) Write(b []byte) (int, error) { 30 apiLogger.WithFields(logrus.Fields{ 31 "API": "response", 32 "X-Reference-Id": l.Header().Get("X-Reference-Id"), 33 }).Trace(string(b)) 34 return l.ResponseWriter.Write(b) 35 } 36 37 func loggingHandler() mux.MiddlewareFunc { 38 return func(h http.Handler) http.Handler { 39 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 40 annotated := apiLogger.WithFields(logrus.Fields{ 41 "API": "request", 42 "X-Reference-Id": r.Header.Get("X-Reference-Id"), 43 }) 44 r.Body = ioutil.NopCloser( 45 io.TeeReader(r.Body, annotated.WriterLevel(logrus.TraceLevel))) 46 47 w = responseWriter{ResponseWriter: w} 48 h.ServeHTTP(w, r) 49 }) 50 } 51 }