Files
logging/middleware/request_logger.go
argoyle 8ff83ae37c
logging / test (push) Has been skipped
logging / vulnerabilities (push) Has been skipped
feat: initial shared logging module
slog SetupLogger (text/json/otel), context logger helpers, MockLogger test
helper, and a request-logger HTTP middleware sub-package. Replaces the logging
package + middleware request-logger copied across the backend services.
2026-06-15 11:52:40 +02:00

39 lines
1012 B
Go

package middleware
import (
"bytes"
"io"
"log/slog"
"net/http"
)
func RequestLogger(logger *slog.Logger) func(handler http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
buff := &bytes.Buffer{}
req := r.Clone(r.Context())
req.Body = io.NopCloser(io.TeeReader(r.Body, buff))
rw := &responseWriter{ResponseWriter: w, statusCode: http.StatusOK}
next.ServeHTTP(rw, req)
logger.With("request", buff.String(), "response", rw.responseBody).Debug("http request")
})
}
}
type responseWriter struct {
http.ResponseWriter
statusCode int
responseBody string
}
func (rw *responseWriter) WriteHeader(statusCode int) {
rw.statusCode = statusCode
rw.ResponseWriter.WriteHeader(statusCode)
}
func (rw *responseWriter) Write(b []byte) (int, error) {
rw.responseBody = string(b) // You may want to capture only part of the response or use a different method
return rw.ResponseWriter.Write(b)
}