code: func NewReplacer(r *http.Request, rr *ResponseRecorder, emptyValue string) Replacer {
  	rb := newLimitWriter(MaxLogBodySize)
  	if r.Body != nil {
  		r.Body = struct {
  			io.Reader
  			io.Closer
  		}{io.TeeReader(r.Body, rb), io.Closer(r.Body)}
  	}
  	return &replacer{
  		request:            r,
  		requestBody:        rb,
  		responseRecorder:   rr,
  		customReplacements: make(map[string]string),
  		emptyValue:         emptyValue,
  	}
  }
docs: // NewReplacer makes a new replacer based on r and rr which
  // are used for request and response placeholders, respectively.
  // Request placeholders are created immediately, whereas
  // response placeholders are not created until Replace()
  // is invoked. rr may be nil if it is not available.
  // emptyValue should be the string that is used in place
  // of empty string (can still be empty string).