我X-Request-Id在context中间件中进行设置(如下所示),以便我可以在有*http.Request结构的地方使用它 - 例如req.Context().Value(middleware.ReqIdKey)。但是,我的代码库中的某些地方无法访问*http.Requeststruct,因此我无法使用contextfetch X-Request-Id。Go 有办法还是我试图做一些根本错误的事情?
内部/中间件/requestid.go
X-Request-Id这是我设置in的中间件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)
})
}
内部/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
})
}
慕少森
慕侠2389804
相关分类