Skip to content

Commit 48e4c61

Browse files
committed
add timzone config to SyslogServerEvent
1 parent 374bc20 commit 48e4c61

File tree

2 files changed

+93
-6
lines changed

2 files changed

+93
-6
lines changed

src/main/java/org/graylog2/syslog4j/server/impl/event/SyslogServerEvent.java

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.graylog2.syslog4j.server.SyslogServerEventIF;
55
import org.graylog2.syslog4j.util.SyslogUtility;
66
import org.joda.time.DateTime;
7+
import org.joda.time.DateTimeZone;
8+
import org.joda.time.format.ISODateTimeFormat;
79

810
import java.net.InetAddress;
911
import java.text.DateFormat;
@@ -12,6 +14,7 @@
1214
import java.util.Calendar;
1315
import java.util.Date;
1416
import java.util.Locale;
17+
import java.util.Objects;
1518

1619
/**
1720
* SyslogServerEvent provides an implementation of the SyslogServerEventIF interface.
@@ -40,12 +43,19 @@ public class SyslogServerEvent implements SyslogServerEventIF {
4043
protected boolean isHostStrippedFromMessage = false;
4144
protected String message = null;
4245
protected InetAddress inetAddress = null;
46+
protected DateTimeZone sysLogServerTimeZone;
4347

4448
protected SyslogServerEvent() {
4549
}
4650

4751
public SyslogServerEvent(final String message, InetAddress inetAddress) {
48-
initialize(message, inetAddress);
52+
initialize(message, inetAddress, null);
53+
54+
parse();
55+
}
56+
57+
public SyslogServerEvent(final String message, InetAddress inetAddress, DateTimeZone sysLogServerTimeZone) {
58+
initialize(message, inetAddress, sysLogServerTimeZone);
4959

5060
parse();
5161
}
@@ -56,6 +66,12 @@ public SyslogServerEvent(final byte[] message, int length, InetAddress inetAddre
5666
parse();
5767
}
5868

69+
public SyslogServerEvent(final byte[] message, int length, InetAddress inetAddress, DateTimeZone sysLogServerTimeZone) {
70+
initialize(message, length, inetAddress, sysLogServerTimeZone);
71+
72+
parse();
73+
}
74+
5975
protected void initialize(final String message, InetAddress inetAddress) {
6076
this.rawString = message;
6177
this.rawLength = message.length();
@@ -64,12 +80,22 @@ protected void initialize(final String message, InetAddress inetAddress) {
6480
this.message = message;
6581
}
6682

83+
protected void initialize(final String message, InetAddress inetAddress, DateTimeZone sysLogServerTimeZone) {
84+
this.sysLogServerTimeZone = sysLogServerTimeZone;
85+
initialize(message, inetAddress);
86+
}
87+
6788
protected void initialize(final byte[] message, int length, InetAddress inetAddress) {
6889
this.rawBytes = message;
6990
this.rawLength = length;
7091
this.inetAddress = inetAddress;
7192
}
7293

94+
protected void initialize(final byte[] message, int length, InetAddress inetAddress, DateTimeZone sysLogServerTimeZone) {
95+
this.sysLogServerTimeZone = sysLogServerTimeZone;
96+
initialize(message, length, inetAddress);
97+
}
98+
7399
protected void parseHost() {
74100
int i = this.message.indexOf(' ');
75101

@@ -96,16 +122,13 @@ protected void parseDate() {
96122
isDate8601 = true;
97123
}
98124

99-
String year = Integer.toString(Calendar.getInstance().get(Calendar.YEAR));
100125
String originalDate = this.message.substring(0, datelength - 1);
101-
String modifiedDate = originalDate + " " + year;
102126

103-
DateFormat dateFormat = new SimpleDateFormat(dateFormatS, Locale.ENGLISH);
104127
try {
105128
if (!isDate8601) {
106-
this.date = dateFormat.parse(modifiedDate);
129+
this.date = parseDateBasedOnFormat(originalDate, datelength, dateFormatS);
107130
} else {
108-
this.date = DateTime.parse(originalDate).toDate();
131+
this.date = parse8601Date(originalDate).toDate();
109132
}
110133

111134
this.message = this.message.substring(datelength);
@@ -118,6 +141,28 @@ protected void parseDate() {
118141
parseHost();
119142
}
120143

144+
private Date parseDateBasedOnFormat(String originalDate, int dateLength, String format) throws ParseException {
145+
String year = Integer.toString(Calendar.getInstance().get(Calendar.YEAR));
146+
String modifiedDate = originalDate + " " + year;
147+
DateFormat dateFormat = new SimpleDateFormat(format, Locale.ENGLISH);
148+
149+
if (Objects.nonNull(sysLogServerTimeZone)) {
150+
dateFormat.setTimeZone(sysLogServerTimeZone.toTimeZone());
151+
}
152+
153+
return dateFormat.parse(modifiedDate);
154+
}
155+
156+
private DateTime parse8601Date(String date) {
157+
boolean hasTimezone = date.substring(date.length() - 6).matches(".*[Z+-].*");
158+
159+
if (!hasTimezone && Objects.nonNull(sysLogServerTimeZone)) {
160+
return DateTime.parse(date, ISODateTimeFormat.dateTimeParser().withZone(sysLogServerTimeZone));
161+
}
162+
163+
return DateTime.parse(date);
164+
}
165+
121166
protected void parsePriority() {
122167
if (this.message.charAt(0) == '<') {
123168
int i = this.message.indexOf(">");

src/test/java/org/graylog2/syslog4j/server/impl/event/SyslogServerEventTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
import org.joda.time.DateTime;
44
import org.joda.time.DateTimeZone;
5+
import org.joda.time.LocalDateTime;
56
import org.junit.Test;
67

78
import java.net.InetAddress;
89
import java.net.InetSocketAddress;
10+
import java.util.Date;
911

1012
import static org.junit.Assert.assertEquals;
13+
import static org.junit.Assert.assertNotEquals;
1114

1215
public class SyslogServerEventTest {
1316
private final InetAddress INET_ADDR = new InetSocketAddress(514).getAddress();
17+
private final DateTimeZone mstZone = DateTimeZone.forID("MST");
18+
private final DateTimeZone cet = DateTimeZone.forID("CET");
1419

1520
private SyslogServerEvent buildEvent(String message) {
1621
return new SyslogServerEvent(message, INET_ADDR);
@@ -185,6 +190,7 @@ public void testRFC5424Timestamps() throws Exception {
185190
// https://tools.ietf.org/html/rfc5424#section-6.2.3.1
186191
final String example1 = "<0>1985-04-12T23:20:50.52Z hostname test[42]: Test";
187192
final SyslogServerEvent event1 = buildEvent(example1);
193+
188194
assertEquals(new DateTime(1985, 4, 12, 23, 20, 50, 520, DateTimeZone.UTC).toDate(), event1.getDate());
189195
assertEquals(0, event1.getFacility());
190196
assertEquals("hostname", event1.getHost());
@@ -224,4 +230,40 @@ public void testRFC5424Timestamps() throws Exception {
224230
assertEquals(0, event5.getLevel());
225231
assertEquals("hostname test[42]: Test", event5.getMessage());
226232
}
233+
234+
@Test
235+
public void testDefaultTimeZoneForRFC5424() {
236+
final String withUtcOffset = "<0>1985-04-12T23:20:50.52Z hostname test[42]: Test";
237+
DateTime utcDateTime = new DateTime(1985, 4, 12, 23, 20, 50, 520, DateTimeZone.UTC);
238+
239+
assertEquals(utcDateTime.toDate(), new SyslogServerEvent(withUtcOffset, INET_ADDR).getDate());
240+
assertEquals(utcDateTime.toDate(), new SyslogServerEvent(withUtcOffset.getBytes(), withUtcOffset.length(), INET_ADDR).getDate());
241+
242+
final String withMstOffset = "<0>1985-04-12T23:20:50.52-07:00 hostname test[42]: Test";
243+
DateTime cetDateTime = new DateTime(1985, 4, 12, 23, 20, 50, 520, cet);
244+
DateTime mstDateTime = new DateTime(1985, 4, 12, 23, 20, 50, 520, mstZone);
245+
SyslogServerEvent syslogServerEventMstWithDefaultCet = new SyslogServerEvent(withMstOffset, INET_ADDR, cet);
246+
247+
assertEquals(mstDateTime.toDate(), new SyslogServerEvent(withMstOffset, INET_ADDR).getDate());
248+
assertEquals(mstDateTime.toDate(), syslogServerEventMstWithDefaultCet.getDate());
249+
assertNotEquals(cetDateTime.toDate(), syslogServerEventMstWithDefaultCet.getDate());
250+
251+
final String withoutOffset = "<0>1985-04-12T23:20:50.52 hostname test[42]: Test";
252+
SyslogServerEvent syslogServerEventCet = new SyslogServerEvent(withoutOffset, INET_ADDR, cet);
253+
254+
assertEquals(cetDateTime.toDate(), syslogServerEventCet.getDate());
255+
assertNotEquals(mstDateTime.toDate(), syslogServerEventCet.getDate());
256+
assertEquals(mstDateTime.toDate(), new SyslogServerEvent(withoutOffset, INET_ADDR, mstZone).getDate());
257+
}
258+
259+
@Test
260+
public void testDefaultTimeZones() {
261+
final String message = "<34>Oct 11 17:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8";
262+
final SyslogServerEvent testWithDefaultConf = new SyslogServerEvent(message, INET_ADDR, mstZone);
263+
final SyslogServerEvent test = new SyslogServerEvent(message, INET_ADDR);
264+
265+
assertEquals(new DateTime(new DateTime().getYear() + "-10-11T17:14:15", mstZone).toDate(), testWithDefaultConf.getDate());
266+
assertEquals(new DateTime(new DateTime().getYear() + "-10-11T17:14:15").toDate(), test.getDate());
267+
268+
}
227269
}

0 commit comments

Comments
 (0)