【发布时间】:2021-08-03 17:01:34
【问题描述】:
我正在尝试在我的网络服务器上记录一些数据,所以我创建了一个 loggingMiddleware 来服务下一个请求,然后记录数据,我认为这样我将在 r *http.Request 中拥有所有必要的数据指针
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// call next handler
next.ServeHTTP(o, r)
// get requestID
reqID := middleware.GetReqID(r.Context())
log.WithFields(
log.Fields{
"request_id": reqID, // drops requestID
"method": r.Method, // http method
"remote_address": r.RemoteAddr, // remote address
"url": r.URL.String(), // url used by the client to access the service
"referer": r.Referer(), // Referer header if present
"user_agent": r.UserAgent(), // User-Agent header
"content_length": r.ContentLength, // Content-Length header if present"
},
).Info()
})
但是,对于 RequestID,只有在 RequestID 中间件在 loggingMiddleware 之前安装时才适用
不工作
...
// get a new chi rotuter
router = chi.NewRouter()
// MIDDLEWARES
// log
// use logrus to log requests
router.Use(LoggingMiddleware)
// requestID
// Generate a unique id for every request
// ids are grouped based on client hostname
router.Use(middleware.RequestID)
...
工作
...
// get a new chi rotuter
router = chi.NewRouter()
// MIDDLEWARES
// requestID
// Generate a unique id for every request
// ids are grouped based on client hostname
router.Use(middleware.RequestID)
// log
// use logrus to log requests
router.Use(LoggingMiddleware)
...
这是预期的行为吗? r *http.Request 指针是否应该指向请求的“更新”版本?有没有办法解决这个问题?
因为,例如,如果我想从 JWT 令牌中提取用户名并将其放入 r.Context() 以便稍后记录,这将需要在 loggingMiddleware 之前安装单独的中间件。
对不起我的英语,如果有不清楚的地方请询问。
谢谢
【问题讨论】: