我正在尝试在我的网络服务器上记录一些数据,所以我创建了一个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
.
对不起我的英语,如果有不清楚的地方,请询问。
谢谢