Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

60 строки
1.3 KiB

  1. package log
  2. import (
  3. "encoding/hex"
  4. "math/rand"
  5. "net/http"
  6. "time"
  7. "github.com/inconshreveable/log15"
  8. )
  9. const (
  10. gaeRequestIDHeader = "X-AppEngine-Request-Log-Id"
  11. )
  12. var random = rand.New(rand.NewSource(time.Now().UnixNano()))
  13. type httpContextHandler struct {
  14. log log15.Logger
  15. next http.Handler
  16. onAppEngine bool
  17. }
  18. // NewHTTPContextHandler adds a context logger based on the given logger to
  19. // each request. After a request passes through this handler,
  20. // Error(req.Context(), "foo") will log to that logger and add useful context
  21. // to each log entry.
  22. func NewHTTPContextHandler(h http.Handler, l log15.Logger, onAppEngine bool) http.Handler {
  23. if l == nil {
  24. l = log15.Root()
  25. }
  26. return &httpContextHandler{
  27. log: l,
  28. next: h,
  29. onAppEngine: onAppEngine,
  30. }
  31. }
  32. func (h *httpContextHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  33. ctx := r.Context()
  34. // We will accept an App Engine Request Header. If there isn't one, we will
  35. // fallback to 16 random bytes (hex encoded).
  36. reqID := r.Header.Get(gaeRequestIDHeader)
  37. if !h.onAppEngine || reqID == "" {
  38. buf := make([]byte, 16)
  39. random.Read(buf)
  40. reqID = hex.EncodeToString(buf)
  41. }
  42. requestLogger := h.log.New(log15.Ctx{
  43. "request_id": reqID,
  44. })
  45. r = r.WithContext(NewContext(ctx, requestLogger))
  46. h.next.ServeHTTP(w, r)
  47. }