code: func (h *Handler) logTheRoundTrip(logDataTable *LogData, crr *captureRequestReader, crw *captureResponseWriter) {
  	core := logDataTable.Core
  
  	retryAttempts, ok := core[RetryAttempts].(int)
  	if !ok {
  		retryAttempts = 0
  	}
  	core[RetryAttempts] = retryAttempts
  
  	if crr != nil {
  		core[RequestContentSize] = crr.count
  	}
  
  	core[DownstreamStatus] = crw.Status()
  
  	// n.b. take care to perform time arithmetic using UTC to avoid errors at DST boundaries.
  	totalDuration := time.Now().UTC().Sub(core[StartUTC].(time.Time))
  	core[Duration] = totalDuration
  
  	if h.keepAccessLog(crw.Status(), retryAttempts, totalDuration) {
  		core[DownstreamContentSize] = crw.Size()
  		if original, ok := core[OriginContentSize]; ok {
  			o64 := original.(int64)
  			if crw.Size() != o64 && crw.Size() != 0 {
  				core[GzipRatio] = float64(o64) / float64(crw.Size())
  			}
  		}
  
  		core[Overhead] = totalDuration
  		if origin, ok := core[OriginDuration]; ok {
  			core[Overhead] = totalDuration - origin.(time.Duration)
  		}
  
  		fields := logrus.Fields{}
  
  		for k, v := range logDataTable.Core {
  			if h.config.Fields.Keep(k) {
  				fields[k] = v
  			}
  		}
  
  		h.redactHeaders(logDataTable.Request, fields, "request_")
  		h.redactHeaders(logDataTable.OriginResponse, fields, "origin_")
  		h.redactHeaders(logDataTable.DownstreamResponse, fields, "downstream_")
  
  		h.mu.Lock()
  		defer h.mu.Unlock()
  		h.logger.WithFields(fields).Println()
  	}
  }
docs: // Logging handler to log frontend name, backend name, and elapsed time.