Я устанавливаю X-Request-Id
в context
в промежуточном программном обеспечении (, как показано ниже ), чтобы я мог использовать его там, где есть *http.Request
struct - например, req.Context().Value(middleware.ReqIdKey)
.Однако в моей кодовой базе есть места, где у меня нет возможности получить доступ к *http.Request
struct, поэтому я не могу использовать context
для получения X-Request-Id
.Есть ли способ в Go или я пытаюсь сделать что-то в корне неправильно?
internal / middleware / requesttid.go
Это промежуточное ПО, где я установил X-Request-Id
в context
.В настоящее время он называется http.ListenAndServe(":8080", middleware.RequestId(SomeHandler))
в моем "серверном" пакете.
package middleware
import (
"context"
"github.com/google/uuid"
"net/http"
)
type val string
const ReqIdKey val = "X-Request-Id"
func RequestId(handler http.Handler) http.Handler {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
val := req.Header.Get("X-Request-Id")
if val == "" {
val = uuid.New().String()
}
ctx1 := context.WithValue(req.Context(), ReqIdKey, val)
ctx2 := req.WithContext(ctx1)
handler.ServeHTTP(res, ctx2)
})
}
internal / logger / logger.go
Это еще один пакет, к которому мне нужно получить доступcontext
или просто X-Request-Id
значение.Кстати, вызов logger.Config
происходит до запуска сервера.
package logger
import (
"github.com/sirupsen/logrus"
"os"
)
var Log *logrus.Entry
func Config() {
logrus.SetLevel(logrus.InfoLevel)
logrus.SetOutput(os.Stdout)
logrus.SetFormatter(&logrus.JSONFormatter{})
Log = logrus.WithFields(logrus.Fields{
"request_id": ..., // I need X-Request-Id value to go here so that all logs have it
})
}