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 }