4
4
import org .graylog2 .syslog4j .server .SyslogServerEventIF ;
5
5
import org .graylog2 .syslog4j .util .SyslogUtility ;
6
6
import org .joda .time .DateTime ;
7
+ import org .joda .time .DateTimeZone ;
8
+ import org .joda .time .format .ISODateTimeFormat ;
7
9
8
10
import java .net .InetAddress ;
9
11
import java .text .DateFormat ;
12
14
import java .util .Calendar ;
13
15
import java .util .Date ;
14
16
import java .util .Locale ;
17
+ import java .util .Objects ;
15
18
16
19
/**
17
20
* SyslogServerEvent provides an implementation of the SyslogServerEventIF interface.
@@ -40,12 +43,19 @@ public class SyslogServerEvent implements SyslogServerEventIF {
40
43
protected boolean isHostStrippedFromMessage = false ;
41
44
protected String message = null ;
42
45
protected InetAddress inetAddress = null ;
46
+ protected DateTimeZone sysLogServerTimeZone ;
43
47
44
48
protected SyslogServerEvent () {
45
49
}
46
50
47
51
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 );
49
59
50
60
parse ();
51
61
}
@@ -56,6 +66,12 @@ public SyslogServerEvent(final byte[] message, int length, InetAddress inetAddre
56
66
parse ();
57
67
}
58
68
69
+ public SyslogServerEvent (final byte [] message , int length , InetAddress inetAddress , DateTimeZone sysLogServerTimeZone ) {
70
+ initialize (message , length , inetAddress , sysLogServerTimeZone );
71
+
72
+ parse ();
73
+ }
74
+
59
75
protected void initialize (final String message , InetAddress inetAddress ) {
60
76
this .rawString = message ;
61
77
this .rawLength = message .length ();
@@ -64,12 +80,22 @@ protected void initialize(final String message, InetAddress inetAddress) {
64
80
this .message = message ;
65
81
}
66
82
83
+ protected void initialize (final String message , InetAddress inetAddress , DateTimeZone sysLogServerTimeZone ) {
84
+ this .sysLogServerTimeZone = sysLogServerTimeZone ;
85
+ initialize (message , inetAddress );
86
+ }
87
+
67
88
protected void initialize (final byte [] message , int length , InetAddress inetAddress ) {
68
89
this .rawBytes = message ;
69
90
this .rawLength = length ;
70
91
this .inetAddress = inetAddress ;
71
92
}
72
93
94
+ protected void initialize (final byte [] message , int length , InetAddress inetAddress , DateTimeZone sysLogServerTimeZone ) {
95
+ this .sysLogServerTimeZone = sysLogServerTimeZone ;
96
+ initialize (message , length , inetAddress );
97
+ }
98
+
73
99
protected void parseHost () {
74
100
int i = this .message .indexOf (' ' );
75
101
@@ -96,16 +122,13 @@ protected void parseDate() {
96
122
isDate8601 = true ;
97
123
}
98
124
99
- String year = Integer .toString (Calendar .getInstance ().get (Calendar .YEAR ));
100
125
String originalDate = this .message .substring (0 , datelength - 1 );
101
- String modifiedDate = originalDate + " " + year ;
102
126
103
- DateFormat dateFormat = new SimpleDateFormat (dateFormatS , Locale .ENGLISH );
104
127
try {
105
128
if (!isDate8601 ) {
106
- this .date = dateFormat . parse ( modifiedDate );
129
+ this .date = parseDateBasedOnFormat ( originalDate , datelength , dateFormatS );
107
130
} else {
108
- this .date = DateTime . parse (originalDate ).toDate ();
131
+ this .date = parse8601Date (originalDate ).toDate ();
109
132
}
110
133
111
134
this .message = this .message .substring (datelength );
@@ -118,6 +141,28 @@ protected void parseDate() {
118
141
parseHost ();
119
142
}
120
143
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
+
121
166
protected void parsePriority () {
122
167
if (this .message .charAt (0 ) == '<' ) {
123
168
int i = this .message .indexOf (">" );
0 commit comments