Skip to content

Commit 20bf196

Browse files
committed
Handle syslog messages per RFC3164 section 4.3.2
1 parent 2d55706 commit 20bf196

File tree

2 files changed

+54
-8
lines changed

2 files changed

+54
-8
lines changed

rfc3164/rfc3164.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package rfc3164
22

33
import (
44
"bytes"
5-
"github.com/Xiol/syslogparser"
65
"time"
6+
7+
"github.com/Xiol/syslogparser"
78
)
89

910
type Parser struct {
@@ -15,6 +16,7 @@ type Parser struct {
1516
header header
1617
message rfc3164message
1718
location *time.Location
19+
skipTag bool
1820
}
1921

2022
type header struct {
@@ -46,13 +48,21 @@ func (p *Parser) Parse() error {
4648
return err
4749
}
4850

51+
tcursor := p.cursor
4952
hdr, err := p.parseHeader()
50-
if err != nil {
53+
if err == syslogparser.ErrTimestampUnknownFormat {
54+
// RFC3164 sec 4.3.2.
55+
hdr.timestamp = time.Now().Round(time.Second)
56+
// No tag processing should be done
57+
p.skipTag = true
58+
// Reset cursor for content read
59+
p.cursor = tcursor
60+
} else if err != nil {
5161
return err
62+
} else {
63+
p.cursor++
5264
}
5365

54-
p.cursor++
55-
5666
msg, err := p.parsemessage()
5767
if err != syslogparser.ErrEOL {
5868
return err
@@ -106,17 +116,19 @@ func (p *Parser) parsemessage() (rfc3164message, error) {
106116
msg := rfc3164message{}
107117
var err error
108118

109-
tag, err := p.parseTag()
110-
if err != nil {
111-
return msg, err
119+
if !p.skipTag {
120+
tag, err := p.parseTag()
121+
if err != nil {
122+
return msg, err
123+
}
124+
msg.tag = tag
112125
}
113126

114127
content, err := p.parseContent()
115128
if err != syslogparser.ErrEOL {
116129
return msg, err
117130
}
118131

119-
msg.tag = tag
120132
msg.content = content
121133

122134
return msg, err

rfc3164/rfc3164_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,40 @@ func (s *Rfc3164TestSuite) TestParser_ValidNoTag(c *C) {
8787
c.Assert(obtained, DeepEquals, expected)
8888
}
8989

90+
// RFC 3164 section 4.3.2
91+
func (s *Rfc3164TestSuite) TestParser_NoTimestamp(c *C) {
92+
buff := []byte("<14>INFO leaving (1) step postscripts")
93+
94+
p := NewParser(buff)
95+
expectedP := &Parser{
96+
buff: buff,
97+
cursor: 0,
98+
l: len(buff),
99+
location: time.UTC,
100+
}
101+
102+
c.Assert(p, DeepEquals, expectedP)
103+
104+
err := p.Parse()
105+
c.Assert(err, IsNil)
106+
107+
now := time.Now()
108+
109+
obtained := p.Dump()
110+
obtained["timestamp"] = now // XXX: Need to mock out time to test this fully
111+
expected := syslogparser.LogParts{
112+
"timestamp": now,
113+
"hostname": "",
114+
"tag": "",
115+
"content": "INFO leaving (1) step postscripts",
116+
"priority": 14,
117+
"facility": 1,
118+
"severity": 6,
119+
}
120+
121+
c.Assert(obtained, DeepEquals, expected)
122+
}
123+
90124
func (s *Rfc3164TestSuite) TestParseHeader_Valid(c *C) {
91125
buff := []byte("Oct 11 22:14:15 mymachine ")
92126
now := time.Now()

0 commit comments

Comments
 (0)