github.com/alibaba/ilogtail/pkg@v0.0.0-20250526110833-c53b480d046c/protocol/converter/jsonline.go (about)

     1  package protocol
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  
     7  	jsoniter "github.com/json-iterator/go"
     8  
     9  	"github.com/alibaba/ilogtail/pkg/protocol"
    10  )
    11  
    12  var (
    13  	sep = []byte("\n")
    14  )
    15  
    16  func (c *Converter) ConvertToJsonlineProtocolStreamFlatten(logGroup *protocol.LogGroup) ([]byte, []map[string]string, error) {
    17  	convertedLogs, _, err := c.ConvertToSingleProtocolLogsFlatten(logGroup, nil)
    18  	if err != nil {
    19  		return nil, nil, err
    20  	}
    21  	joinedStream := *GetPooledByteBuf()
    22  	for i, log := range convertedLogs {
    23  		switch c.Encoding {
    24  		case EncodingJSON:
    25  			var err error
    26  			joinedStream, err = marshalWithoutHTMLEscapedWithoutAlloc(log, bytes.NewBuffer(joinedStream))
    27  			if err != nil {
    28  				// release byte buffer
    29  				PutPooledByteBuf(&joinedStream)
    30  				return nil, nil, fmt.Errorf("unable to marshal log: %v", log)
    31  			}
    32  			// trim and append a \n
    33  			joinedStream = trimRightByte(joinedStream, sep[0])
    34  			if i < len(convertedLogs)-1 {
    35  				joinedStream = append(joinedStream, sep[0])
    36  			}
    37  		default:
    38  			return nil, nil, fmt.Errorf("unsupported encoding format: %s", c.Encoding)
    39  		}
    40  	}
    41  	return joinedStream, nil, nil
    42  }
    43  
    44  func marshalWithoutHTMLEscapedWithoutAlloc(data interface{}, bf *bytes.Buffer) ([]byte, error) {
    45  	enc := jsoniter.ConfigFastest.NewEncoder(bf)
    46  	if err := enc.Encode(data); err != nil {
    47  		return nil, err
    48  	}
    49  	return bf.Bytes(), nil
    50  }
    51  
    52  func trimRightByte(s []byte, c byte) []byte {
    53  	for len(s) > 0 && s[len(s)-1] == c {
    54  		s = s[:len(s)-1]
    55  	}
    56  	return s
    57  }