code: func (r *LoggableSpanRecorder) RecordSpan(span RawSpan) {
  	// short circuit if theres nothing to write to
  	if !writer.WriterGroup.Active() {
  		return
  	}
  
  	sl := make([]SpanLog, len(span.Logs))
  	for i := range span.Logs {
  		sl[i].Timestamp = span.Logs[i].Timestamp
  		sf := make([]SpanField, len(span.Logs[i].Fields))
  		sl[i].Field = sf
  		for j := range span.Logs[i].Fields {
  			sf[j].Key = span.Logs[i].Fields[j].Key()
  			sf[j].Value = fmt.Sprint(span.Logs[i].Fields[j].Value())
  		}
  	}
  
  	tags := make(map[string]interface{}, len(span.Tags))
  	for k, v := range span.Tags {
  		switch vt := v.(type) {
  		case bool, string, int, int8, int16, int32, int64, uint, uint8, uint16, uint64:
  			tags[k] = v
  		case []byte:
  			base64.StdEncoding.EncodeToString(vt)
  		default:
  			tags[k] = fmt.Sprint(v)
  		}
  	}
  
  	spanlog := &LoggableSpan{
  		TraceID:      span.Context.TraceID,
  		SpanID:       span.Context.SpanID,
  		ParentSpanID: span.ParentSpanID,
  		Operation:    span.Operation,
  		Start:        span.Start,
  		Duration:     span.Duration,
  		Tags:         tags,
  		Logs:         sl,
  	}
  
  	var buf bytes.Buffer
  	encoder := json.NewEncoder(&buf)
  	encoder.SetEscapeHTML(false)
  	err := encoder.Encode(spanlog)
  	if err != nil {
  		fmt.Fprintf(os.Stderr, "ERROR FORMATTING SPAN ENTRY: %s\n", err)
  		return
  	}
  
  	writer.WriterGroup.Write(buf.Bytes())
  }
docs: // RecordSpan implements the respective method of SpanRecorder.