github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/pkg/promtail/targets/syslog/syslogparser/syslogparser.go (about)

     1  package syslogparser
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/influxdata/go-syslog/v3"
     9  	"github.com/influxdata/go-syslog/v3/nontransparent"
    10  	"github.com/influxdata/go-syslog/v3/octetcounting"
    11  )
    12  
    13  // ParseStream parses a rfc5424 syslog stream from the given Reader, calling
    14  // the callback function with the parsed messages. The parser automatically
    15  // detects octet counting.
    16  // The function returns on EOF or unrecoverable errors.
    17  func ParseStream(r io.Reader, callback func(res *syslog.Result), maxMessageLength int) error {
    18  	buf := bufio.NewReaderSize(r, 1<<10)
    19  
    20  	b, err := buf.ReadByte()
    21  	if err != nil {
    22  		return err
    23  	}
    24  	_ = buf.UnreadByte()
    25  
    26  	if b == '<' {
    27  		nontransparent.NewParser(syslog.WithListener(callback), syslog.WithMaxMessageLength(maxMessageLength), syslog.WithBestEffort()).Parse(buf)
    28  	} else if b >= '0' && b <= '9' {
    29  		octetcounting.NewParser(syslog.WithListener(callback), syslog.WithMaxMessageLength(maxMessageLength), syslog.WithBestEffort()).Parse(buf)
    30  	} else {
    31  		return fmt.Errorf("invalid or unsupported framing. first byte: '%s'", string(b))
    32  	}
    33  
    34  	return nil
    35  }