df/bff/api/logger.go
2023-10-02 09:59:45 +02:00

75 lines
1.4 KiB
Go

package api
import (
"bytes"
"fmt"
"io"
"log/slog"
"time"
"github.com/gin-gonic/gin"
)
type responseBodyWriter struct {
gin.ResponseWriter
body *bytes.Buffer
}
func (r responseBodyWriter) Write(b []byte) (int, error) {
r.body.Write(b)
return r.ResponseWriter.Write(b)
}
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
var body []byte
var w *responseBodyWriter
if c.Request.Method != "GET" {
body, _ = io.ReadAll(c.Request.Body)
w = &responseBodyWriter{body: &bytes.Buffer{}, ResponseWriter: c.Writer}
c.Writer = w
c.Request.Body = io.NopCloser(bytes.NewReader(body))
}
c.Next()
duration := time.Since(t).Milliseconds()
if c.Request.Method != "GET" {
slog.LogAttrs(
c,
slog.LevelDebug,
"http",
slog.Group(
"request",
slog.Int("STATUS", c.Writer.Status()),
slog.String("METHOD", c.Request.Method),
slog.String("PATH", c.Request.RequestURI),
slog.String("DURATION", fmt.Sprintf("%d ms", duration)),
slog.String("BODY", string(body)),
),
slog.Group(
"response",
slog.String("BODY", w.body.String()),
),
)
} else {
slog.LogAttrs(
c,
slog.LevelDebug,
"http",
slog.Group(
"request",
slog.Int("STATUS", c.Writer.Status()),
slog.String("METHOD", c.Request.Method),
slog.String("PATH", c.Request.RequestURI),
slog.String("DURATION", fmt.Sprintf("%d ms", duration)),
),
)
}
}
}