feat: initial shared logging module
logging / test (push) Has been skipped
logging / vulnerabilities (push) Has been skipped

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.
This commit is contained in:
2026-06-15 11:52:40 +02:00
commit 8ff83ae37c
10 changed files with 320 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
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)
}
+26
View File
@@ -0,0 +1,26 @@
package middleware
import (
"log/slog"
"net/http"
"net/http/httptest"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestRequestLogger(t *testing.T) {
called := false
h := RequestLogger(slog.New(slog.NewTextHandler(nil, nil)))(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
called = true
w.WriteHeader(http.StatusCreated)
_, _ = w.Write([]byte("ok"))
}))
req := httptest.NewRequest(http.MethodPost, "/q", strings.NewReader("body"))
rw := httptest.NewRecorder()
h.ServeHTTP(rw, req)
assert.True(t, called)
assert.Equal(t, http.StatusCreated, rw.Code)
assert.Equal(t, "ok", rw.Body.String())
}