diff --git a/pkg/apiserver/logging_middleware.go b/pkg/apiserver/logging_middleware.go index bbdfd07..f72c858 100644 --- a/pkg/apiserver/logging_middleware.go +++ b/pkg/apiserver/logging_middleware.go @@ -1,6 +1,7 @@ package apiserver import ( + "encoding/json" "fmt" "net" "net/http" @@ -8,6 +9,7 @@ import ( "strings" "time" + "github.com/acorn-io/acorn-dns/pkg/model" "github.com/sirupsen/logrus" ) @@ -29,6 +31,7 @@ func realIP(req *http.Request) string { type responseWriter struct { http.ResponseWriter status int + body []byte wroteHeader bool } @@ -50,6 +53,11 @@ func (rw *responseWriter) WriteHeader(code int) { rw.wroteHeader = true } +func (rw *responseWriter) Write(data []byte) (int, error) { + rw.body = append(rw.body, data...) + return rw.ResponseWriter.Write(data) +} + // loggingMiddleware logs the incoming HTTP request & its duration. func loggingMiddleware(logger *logrus.Entry) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { @@ -80,7 +88,7 @@ func loggingMiddleware(logger *logrus.Entry) func(http.Handler) http.Handler { msg := fmt.Sprintf("handled: %d", wrapped.status) if wrapped.status >= 400 { - requestLogger.Error(msg) + requestLogger.WithFields(logrus.Fields{"error": asErrorResponseModel(wrapped.body).Message}).Errorf(msg) } else { requestLogger.Debug(msg) } @@ -90,3 +98,10 @@ func loggingMiddleware(logger *logrus.Entry) func(http.Handler) http.Handler { return http.HandlerFunc(fn) } } + +// asErrorResponseModel converts a byte array to an ErrorResponse model if possible +func asErrorResponseModel(data []byte) model.ErrorResponse { + o := model.ErrorResponse{} + _ = json.Unmarshal(data, &o) + return o +} diff --git a/pkg/apiserver/responsewriter.go b/pkg/apiserver/responsewriter.go index 9f00b21..3a55cf7 100644 --- a/pkg/apiserver/responsewriter.go +++ b/pkg/apiserver/responsewriter.go @@ -5,7 +5,6 @@ import ( "net/http" "github.com/acorn-io/acorn-dns/pkg/model" - "github.com/sirupsen/logrus" ) func writeErrorResponse(w http.ResponseWriter, httpStatus int, message string, data interface{}) { @@ -22,7 +21,6 @@ func writeErrorResponse(w http.ResponseWriter, httpStatus int, message string, d } func handleError(w http.ResponseWriter, httpStatus int, err error) { - logrus.Errorf("Error during request: %v", err) writeErrorResponse(w, httpStatus, err.Error(), nil) }