package fog import ( "errors" "fmt" "net/http" "github.com/go-logr/logr" ) // MiddlewareLogger is middleware that decorates a logger with an operation ID as well as http requests and response information // it adds response body information if the response status is greater than 400 func MiddlewareLogger(l logr.Logger, middlewareContext *MiddlewareContext) { r := middlewareContext.Request status := middlewareContext.Status logmsg := fmt.Sprintf("%s %s %d %s", r.Method, r.URL.Path, status, http.StatusText(status)) l.WithValues( "httpRequest", map[string]interface{}{ "requestMethod": r.Method, "requestUrl": r.RequestURI, "status": status, "bytes": middlewareContext.Size, "elapsed": middlewareContext.Time.Microseconds(), }, SeverityKey, levelSeverity(status), ) if status > 400 { l.WithValues("httpResponse", map[string]interface{}{ "body": middlewareContext.Body.String(), }) } if status < 500 { l.Info(logmsg) } else { l.Error(errors.New(http.StatusText(status)), logmsg) } } // Maps httpStatus to Google cloud log level names func levelSeverity(status int) string { switch { case status <= 0: return Warning case status < 400: //for codes in 100s, 200s, 300s return Info case status >= 400 && status < 500: return Warning case status >= 500: return Error default: return Info } }