@@ -2,21 +2,25 @@ package syslog
2
2
3
3
import (
4
4
"bufio"
5
+ "bytes"
5
6
"errors"
6
7
"net"
8
+ "strconv"
7
9
"sync"
8
10
11
+ "time"
12
+
9
13
"github.com/jeromer/syslogparser"
10
14
"github.com/jeromer/syslogparser/rfc3164"
11
15
"github.com/jeromer/syslogparser/rfc5424"
12
- "time"
13
16
)
14
17
15
18
type Format int
16
19
17
20
const (
18
21
RFC3164 Format = 1 + iota // RFC3164: http://www.ietf.org/rfc/rfc3164.txt
19
22
RFC5424 // RFC5424: http://www.ietf.org/rfc/rfc5424.txt
23
+ RFC6587 // RFC6587: http://www.ietf.org/rfc/rfc6587.txt
20
24
)
21
25
22
26
type Server struct {
@@ -37,7 +41,7 @@ func NewServer() *Server {
37
41
return server
38
42
}
39
43
40
- //Sets the syslog format (RFC3164 or RFC5424)
44
+ //Sets the syslog format (RFC3164 or RFC5424 or RFC6587 )
41
45
func (self * Server ) SetFormat (format Format ) {
42
46
self .format = format
43
47
}
@@ -154,8 +158,33 @@ type ScanCloser struct {
154
158
closer TimeoutCloser
155
159
}
156
160
161
+ func rfc6587ScannerSplit (data []byte , atEOF bool ) (advance int , token []byte , err error ) {
162
+ if atEOF && len (data ) == 0 {
163
+ return 0 , nil , nil
164
+ }
165
+
166
+ if i := bytes .IndexByte (data , ' ' ); i > 0 {
167
+ pLength := data [0 :i ]
168
+ length , err := strconv .Atoi (string (pLength ))
169
+ if err != nil {
170
+ return 0 , nil , err
171
+ }
172
+ if len (data ) >= length + i + 1 {
173
+ //Return the frame with the length removed
174
+ return length + i + 1 , data [i + 1 : length + i + 1 ], nil
175
+ }
176
+ }
177
+
178
+ // Request more data
179
+ return 0 , nil , nil
180
+ }
181
+
157
182
func (self * Server ) goScanConnection (connection net.Conn , needClose bool ) {
158
183
scanner := bufio .NewScanner (connection )
184
+ switch self .format {
185
+ case RFC6587 :
186
+ scanner .Split (rfc6587ScannerSplit )
187
+ }
159
188
160
189
var scanCloser * ScanCloser
161
190
if needClose {
@@ -170,10 +199,12 @@ func (self *Server) goScanConnection(connection net.Conn, needClose bool) {
170
199
171
200
func (self * Server ) scan (scanCloser * ScanCloser ) {
172
201
if scanCloser .closer == nil {
202
+ // UDP
173
203
for scanCloser .Scan () {
174
204
self .parser ([]byte (scanCloser .Text ()))
175
205
}
176
206
} else {
207
+ // TCP
177
208
loop:
178
209
for {
179
210
select {
@@ -202,7 +233,7 @@ func (self *Server) parser(line []byte) {
202
233
switch self .format {
203
234
case RFC3164 :
204
235
parser = self .getParserRFC3164 (line )
205
- case RFC5424 :
236
+ case RFC5424 , RFC6587 :
206
237
parser = self .getParserRFC5424 (line )
207
238
}
208
239
0 commit comments