diff --git a/request_logger.go b/request_logger.go index 2ec4961..56b0a8e 100644 --- a/request_logger.go +++ b/request_logger.go @@ -1,24 +1,28 @@ package unitel import ( + "fmt" "time" "github.com/getsentry/sentry-go" "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/utils" "github.com/rs/zerolog" "go.opentelemetry.io/otel/trace" ) const requestBufferSize = 1000 -func RequestLogger(l zerolog.Logger) fiber.Handler { +func RequestLogger(l zerolog.Logger, requestHeaders, responseHeaders bool) fiber.Handler { type request struct { - Method string - Path string - Status int - Duration time.Duration - OtelSpanID *trace.SpanID - SentrySpanID *sentry.SpanID + Method string + Path string + Status int + Duration time.Duration + RequestHeaders map[string][]string + ResponseHeaders map[string][]string + OtelSpanID *trace.SpanID + SentrySpanID *sentry.SpanID } reqs := make(chan request, requestBufferSize) @@ -41,6 +45,22 @@ func RequestLogger(l zerolog.Logger) fiber.Handler { l2 = l2.Str("sentry_span_id", r.SentrySpanID.String()) } + if requestHeaders { + for k, v := range r.RequestHeaders { + for i, vv := range v { + l2 = l2.Str(fmt.Sprintf("request.headers.%s.%d", k, i), vv) + } + } + } + + if responseHeaders { + for k, v := range r.ResponseHeaders { + for i, vv := range v { + l2 = l2.Str(fmt.Sprintf("response.headers.%s.%d", k, i), vv) + } + } + } + l2.Msg("request") } }() @@ -71,7 +91,7 @@ func RequestLogger(l zerolog.Logger) fiber.Handler { } // pushing the request to the logger, so we don't block the requests - reqs <- request{ + req := request{ Method: c.Method(), Path: c.Path(), Status: status, @@ -80,6 +100,26 @@ func RequestLogger(l zerolog.Logger) fiber.Handler { SentrySpanID: sentrySpanId, } + if requestHeaders { + req.RequestHeaders = make(map[string][]string) + for k, v := range c.GetReqHeaders() { + for _, vv := range v { + req.RequestHeaders[k] = append(req.RequestHeaders[k], utils.CopyString(vv)) + } + } + } + + if responseHeaders { + req.ResponseHeaders = make(map[string][]string) + for k, v := range c.GetRespHeaders() { + for _, vv := range v { + req.ResponseHeaders[k] = append(req.ResponseHeaders[k], utils.CopyString(vv)) + } + } + } + + reqs <- req + return err } }