Hi Kai,
type requestIDKey struct{}
// RequestID generates a random ID for each HTTP request
func RequestID(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
id, err := generateRandomString(24)
if err != nil {
// Handle error
}
ctx := Request.Context()
ctx.WithValue(ctx, requestIDKey{}, id)
r.WithContext(ctx)
next.ServeHTTP(w, r)
}
return http.HandlerFunc(fn)
}
// LogRequest logs each HTTP request, using the given logger.
func LogRequest(logger log.Logger) func(http.Handler) http.Handler {
fn := func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
request.
start := time.Now()
next.ServeHTTP(w, r)
logger.Log(
"id": r.Context().Value(requestIDKey{}).(string)
"method", r.Method,
"host", r.Host,
"url", r.URL.String(),
"ip", r.RemoteAddr,
"forwarded-ip", r.Header.Get("X-Forwarded-For"),
"duration", time.Since(start),
)
})
}
return fn
}