summaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--pkg/logger/body_writer.go23
-rw-r--r--pkg/logger/middleware.go8
2 files changed, 27 insertions, 4 deletions
diff --git a/pkg/logger/body_writer.go b/pkg/logger/body_writer.go
index 60da151..f57a03e 100644
--- a/pkg/logger/body_writer.go
+++ b/pkg/logger/body_writer.go
@@ -2,6 +2,7 @@ package logger
import (
"bufio"
+ "bytes"
"errors"
"net"
"net/http"
@@ -9,11 +10,20 @@ import (
type bodyWriter struct {
http.ResponseWriter
- status int
+ body *bytes.Buffer
+ maxSize int
+ bytes int
+ status int
}
-func newBodyWriter(writer http.ResponseWriter) *bodyWriter {
+func newBodyWriter(writer http.ResponseWriter, recordBody bool) *bodyWriter {
+ var body *bytes.Buffer
+ if recordBody {
+ body = bytes.NewBufferString("")
+ }
return &bodyWriter{
+ body: body,
+ maxSize: 64000,
ResponseWriter: writer,
status: http.StatusNotImplemented,
}
@@ -21,6 +31,15 @@ func newBodyWriter(writer http.ResponseWriter) *bodyWriter {
// implements http.ResponseWriter
func (w *bodyWriter) Write(b []byte) (int, error) {
+ if w.body != nil {
+ if w.body.Len()+len(b) > w.maxSize {
+ w.body.Write(b[:w.maxSize-w.body.Len()])
+ } else {
+ w.body.Write(b)
+ }
+ }
+
+ w.bytes += len(b)
return w.ResponseWriter.Write(b)
}
diff --git a/pkg/logger/middleware.go b/pkg/logger/middleware.go
index d0a6a65..54cca96 100644
--- a/pkg/logger/middleware.go
+++ b/pkg/logger/middleware.go
@@ -8,7 +8,7 @@ import (
"time"
)
-func Middleware(next http.Handler) http.Handler {
+func Middleware(next http.Handler, recordBody bool) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" && r.URL.Path == "/healthz" {
next.ServeHTTP(w, r)
@@ -29,7 +29,7 @@ func Middleware(next http.Handler) http.Handler {
path := r.URL.Path
query := r.URL.RawQuery
- bw := newBodyWriter(w)
+ bw := newBodyWriter(w, recordBody)
next.ServeHTTP(bw, r)
@@ -45,8 +45,12 @@ func Middleware(next http.Handler) http.Handler {
responseAttributes := []slog.Attr{
slog.Time("time", end.UTC()),
slog.Duration("latency", end.Sub(start)),
+ slog.Int("length", bw.bytes),
slog.Int("status", bw.status),
}
+ if recordBody {
+ responseAttributes = append(responseAttributes, slog.String("body", bw.body.String()))
+ }
attributes := []slog.Attr{
{
Key: "request",