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 }