Skip to content

Commit 7af0c07

Browse files
committed
add timezone config to StructuredSyslogServerEvent and detect tz
1 parent 396dcf1 commit 7af0c07

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,18 @@ private Date parseDateBasedOnFormat(String originalDate, int dateLength, String
148148
}
149149

150150
private DateTime parse8601Date(String date) {
151-
boolean hasTimezone = date.substring(date.length() - 6).matches(".*[Z+-].*");
152151

153-
if (!hasTimezone && Objects.nonNull(sysLogServerTimeZone)) {
152+
if (!hasTimeZone(date) && Objects.nonNull(sysLogServerTimeZone)) {
154153
return DateTime.parse(date, ISODateTimeFormat.dateTimeParser().withZone(sysLogServerTimeZone));
155154
}
156155

157156
return DateTime.parse(date);
158157
}
159158

159+
protected boolean hasTimeZone(String date) {
160+
return date.substring(date.length() - 6).matches(".*[Z+-].*");
161+
}
162+
160163
protected void parsePriority() {
161164
if (this.message.charAt(0) == '<') {
162165
int i = this.message.indexOf(">");

src/main/java/org/graylog2/syslog4j/server/impl/event/structured/StructuredSyslogServerEvent.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
import org.graylog2.syslog4j.impl.message.structured.StructuredSyslogMessage;
55
import org.graylog2.syslog4j.server.impl.event.SyslogServerEvent;
66
import org.joda.time.DateTime;
7+
import org.joda.time.DateTimeZone;
78
import org.joda.time.format.DateTimeFormatter;
89
import org.joda.time.format.ISODateTimeFormat;
910

1011
import java.net.InetAddress;
1112
import java.util.Locale;
13+
import java.util.Objects;
1214

1315
/**
1416
* SyslogServerStructuredEvent provides an implementation of the
@@ -43,12 +45,25 @@ public StructuredSyslogServerEvent(final byte[] message, int length, InetAddress
4345
parse();
4446
}
4547

48+
public StructuredSyslogServerEvent(final byte[] message, int length, InetAddress inetAddres, DateTimeZone sysLogServerTimeZone) {
49+
super();
50+
51+
initialize(message, length, inetAddress, sysLogServerTimeZone);
52+
parse();
53+
}
54+
4655
public StructuredSyslogServerEvent(final String message, InetAddress inetAddress) {
4756
super();
4857

4958
initialize(message, inetAddress, null);
5059
parse();
5160
}
61+
public StructuredSyslogServerEvent(final String message, InetAddress inetAddress, DateTimeZone sysLogServerTimeZone) {
62+
super();
63+
64+
initialize(message, inetAddress, sysLogServerTimeZone);
65+
parse();
66+
}
5267

5368
public DateTimeFormatter getDateTimeFormatter() {
5469
if (dateTimeFormatter == null) {
@@ -103,6 +118,10 @@ protected void parseDate() {
103118
try {
104119
DateTimeFormatter formatter = getDateTimeFormatter();
105120

121+
if (!hasTimeZone(dateString) && Objects.nonNull(sysLogServerTimeZone)) {
122+
formatter = formatter.withZone(sysLogServerTimeZone);
123+
}
124+
106125
this.dateTime = formatter.parseDateTime(dateString);
107126
this.date = this.dateTime.toDate();
108127

src/test/java/org/graylog2/syslog4j/server/impl/event/structured/StructuredSyslogServerEventTest.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package org.graylog2.syslog4j.server.impl.event.structured;
22

33
import org.joda.time.DateTime;
4+
import org.joda.time.DateTimeZone;
45
import org.junit.Test;
56

67
import java.net.InetAddress;
78
import java.net.InetSocketAddress;
9+
import java.time.ZoneId;
10+
import java.time.ZoneOffset;
11+
import java.time.ZonedDateTime;
812
import java.util.HashMap;
913
import java.util.Map;
1014

1115
import static org.junit.Assert.assertEquals;
1216

1317

1418
public class StructuredSyslogServerEventTest {
19+
public static final DateTimeZone MST = DateTimeZone.forID("MST");
1520
private final InetAddress INET_ADDR = new InetSocketAddress(514).getAddress();
1621

1722
private StructuredSyslogServerEvent buildEvent(String message) {
@@ -223,4 +228,24 @@ public void testStructuredSyslogNgNoMillisecTimestamp() throws Exception {
223228
assertEquals(null, event.getStructuredMessage().getMessageId());
224229
assertEquals("syslog-ng starting up; version='3.5.3'", event.getStructuredMessage().getMessage());
225230
}
226-
}
231+
232+
@Test
233+
public void testDefaultTimeZoneNotSet() throws Exception {
234+
// Message from: https://github.com/Graylog2/graylog2-server/issues/845
235+
final String messageWithoutZone = "<45>1 2014-10-21T10:21:09 c4dc57ba1ebb syslog-ng 7120 - [meta sequenceId=\"1\"] syslog-ng starting up; version='3.5.3'";
236+
final String messageWithZone = "<45>1 2014-10-21T10:21:09-07:00 c4dc57ba1ebb syslog-ng 7120 - [meta sequenceId=\"1\"] syslog-ng starting up; version='3.5.3'";
237+
238+
assertEquals(new DateTime("2014-10-21T10:21:09.000"), buildEvent(messageWithoutZone).getDateTime());
239+
assertEquals(new DateTime("2014-10-21T10:21:09.000-07:00"), buildEvent(messageWithZone).getDateTime());
240+
}
241+
242+
@Test
243+
public void testDefaultTimeZoneSet() throws Exception {
244+
// Message from: https://github.com/Graylog2/graylog2-server/issues/845
245+
final String messageWithoutZone = "<45>1 2014-10-21T10:21:09 c4dc57ba1ebb syslog-ng 7120 - [meta sequenceId=\"1\"] syslog-ng starting up; version='3.5.3'";
246+
final String messageWithZone = "<45>1 2014-10-21T10:21:09+01:00 c4dc57ba1ebb syslog-ng 7120 - [meta sequenceId=\"1\"] syslog-ng starting up; version='3.5.3'";
247+
ZonedDateTime of = ZonedDateTime.of(2014, 10, 21, 10, 21, 9, 0, MST.toTimeZone().toZoneId());
248+
assertEquals(new DateTime("2014-10-21T10:21:09.000-07:00", MST), new StructuredSyslogServerEvent(messageWithoutZone, INET_ADDR, MST).getDateTime());
249+
assertEquals(new DateTime("2014-10-21T10:21:09.000+01:00"), new StructuredSyslogServerEvent(messageWithZone, INET_ADDR, MST).getDateTime());
250+
}
251+
}

0 commit comments

Comments
 (0)