X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/88a29cd091468feb98e5cd541c560f4d35bca716..6d95130da47af9fd0290d3c8f80a0364faf74957:/sdk/go/httpserver/logger.go diff --git a/sdk/go/httpserver/logger.go b/sdk/go/httpserver/logger.go index 569931a3ed..30f5e2612b 100644 --- a/sdk/go/httpserver/logger.go +++ b/sdk/go/httpserver/logger.go @@ -9,38 +9,58 @@ import ( "net/http" "time" - "git.curoverse.com/arvados.git/sdk/go/stats" - "github.com/Sirupsen/logrus" + "git.arvados.org/arvados.git/sdk/go/ctxlog" + "git.arvados.org/arvados.git/sdk/go/stats" + "github.com/sirupsen/logrus" ) type contextKey struct { name string } -var requestTimeContextKey = contextKey{"requestTime"} +var ( + requestTimeContextKey = contextKey{"requestTime"} +) -var Logger logrus.FieldLogger = logrus.StandardLogger() +// HandlerWithContext returns an http.Handler that changes the request +// context to ctx (replacing http.Server's default +// context.Background()), then calls next. +func HandlerWithContext(ctx context.Context, next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} // LogRequests wraps an http.Handler, logging each request and -// response via logrus. +// response. func LogRequests(h http.Handler) http.Handler { return http.HandlerFunc(func(wrapped http.ResponseWriter, req *http.Request) { w := &responseTimer{ResponseWriter: WrapResponseWriter(wrapped)} - req = req.WithContext(context.WithValue(req.Context(), &requestTimeContextKey, time.Now())) - lgr := Logger.WithFields(logrus.Fields{ + lgr := ctxlog.FromContext(req.Context()).WithFields(logrus.Fields{ "RequestID": req.Header.Get("X-Request-Id"), "remoteAddr": req.RemoteAddr, "reqForwardedFor": req.Header.Get("X-Forwarded-For"), "reqMethod": req.Method, + "reqHost": req.Host, "reqPath": req.URL.Path[1:], + "reqQuery": req.URL.RawQuery, "reqBytes": req.ContentLength, }) + ctx := req.Context() + ctx = context.WithValue(ctx, &requestTimeContextKey, time.Now()) + ctx = ctxlog.Context(ctx, lgr) + req = req.WithContext(ctx) + logRequest(w, req, lgr) defer logResponse(w, req, lgr) h.ServeHTTP(w, req) }) } +func Logger(req *http.Request) logrus.FieldLogger { + return ctxlog.FromContext(req.Context()) +} + func logRequest(w *responseTimer, req *http.Request, lgr *logrus.Entry) { lgr.Info("request") } @@ -58,11 +78,15 @@ func logResponse(w *responseTimer, req *http.Request, lgr *logrus.Entry) { if respCode == 0 { respCode = http.StatusOK } - lgr.WithFields(logrus.Fields{ + fields := logrus.Fields{ "respStatusCode": respCode, "respStatus": http.StatusText(respCode), "respBytes": w.WroteBodyBytes(), - }).Info("response") + } + if respCode >= 400 { + fields["respBody"] = string(w.Sniffed()) + } + lgr.WithFields(fields).Info("response") } type responseTimer struct {