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  }