Skip to content

Commit b439f84

Browse files
author
Huksley
committed
Full support for plain syslog messages. Initial implementation of
structured syslog, CEF introduced.
1 parent 098f63c commit b439f84

File tree

9 files changed

+257
-82
lines changed

9 files changed

+257
-82
lines changed

.classpath

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
66
<classpathentry kind="lib" path="lib/graylog.jar"/>
77
<classpathentry kind="lib" path="lib/junit.jar"/>
8+
<classpathentry kind="lib" path="lib/syslog4j-0.9.46.jar" sourcepath="lib/syslog4j-0.9.46.jar"/>
89
<classpathentry kind="output" path="build"/>
910
</classpath>

lib/syslog4j-0.9.46.jar

361 KB
Binary file not shown.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.wizecore.graylog2.plugin;
2+
3+
import org.graylog2.plugin.Message;
4+
import org.graylog2.syslog4j.SyslogIF;
5+
6+
/**
7+
* Using CEF format
8+
*/
9+
10+
/*
11+
* http://blog.rootshell.be/2011/05/11/ossec-speaks-arcsight/
12+
*
13+
*
14+
* CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|\
15+
Name|Severity|Extension
16+
17+
CEF:0|ArcSight|Logger|5.0.0.5355.2|sensor:115|Logger Internal Event|1|\
18+
cat=/Monitor/Sensor/Fan5 cs2=Current Value cnt=1 dvc=10.0.0.1 cs3=Ok \
19+
cs1=null type=0 cs1Label=unit rt=1305034099211 cs3Label=Status cn1Label=value \
20+
cs2Label=timeframe
21+
*/
22+
public class CEFSender implements MessageSender {
23+
24+
@Override
25+
public void send(SyslogIF syslog, int level, Message msg) {
26+
throw new UnsupportedOperationException("CEF is not yet complete!");
27+
}
28+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.wizecore.graylog2.plugin;
2+
3+
import org.graylog2.plugin.Message;
4+
import org.graylog2.syslog4j.SyslogIF;
5+
6+
/**
7+
* Optimized sender
8+
*/
9+
public interface MessageSender {
10+
void send(SyslogIF syslog, int level, Message msg);
11+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.wizecore.graylog2.plugin;
2+
3+
import java.text.SimpleDateFormat;
4+
import java.util.Date;
5+
import java.util.Locale;
6+
import java.util.logging.Logger;
7+
8+
import org.graylog2.plugin.Message;
9+
import org.graylog2.syslog4j.SyslogIF;
10+
11+
/**
12+
* Formats fields into message text
13+
*/
14+
public class PlainSender implements MessageSender {
15+
private Logger log = Logger.getLogger(PlainSender.class.getName());
16+
17+
public static final String SYSLOG_DATEFORMAT = "MMM dd HH:mm:ss";
18+
19+
/**
20+
* From syslog4j
21+
*
22+
* @param dt
23+
* @return
24+
*/
25+
public static String formatTimestamp(Date dt) {
26+
SimpleDateFormat dateFormat = new SimpleDateFormat(SYSLOG_DATEFORMAT,Locale.ENGLISH);
27+
String datePrefix = dateFormat.format(dt);
28+
29+
StringBuilder buffer = new StringBuilder();
30+
int pos = buffer.length() + 4;
31+
buffer.append(datePrefix);
32+
33+
// RFC 3164 requires leading space for days 1-9
34+
if (buffer.charAt(pos) == '0') {
35+
buffer.setCharAt(pos,' ');
36+
}
37+
return buffer.toString();
38+
}
39+
40+
@Override
41+
public void send(SyslogIF syslog, int level, Message msg) {
42+
Date dt = null;
43+
Object ts = msg.getField("timestamp");
44+
if (ts != null && ts instanceof Number) {
45+
dt = new Date(((Number) ts).longValue());
46+
}
47+
48+
if (dt == null) {
49+
dt = new Date();
50+
}
51+
52+
StringBuilder out = new StringBuilder();
53+
54+
// Write time
55+
out.append(formatTimestamp(dt));
56+
out.append(" ");
57+
58+
// Write source (host)
59+
String source = msg.getSource();
60+
if (source != null) {
61+
out.append(source).append(" ");
62+
}
63+
64+
// Write service
65+
Object facility = msg.getField("facility");
66+
if (facility != null) {
67+
out.append("[").append(facility.toString()).append("]");
68+
}
69+
70+
Object username = msg.getField("username");
71+
if (username != null) {
72+
out.append("[").append(username.toString()).append("]");
73+
}
74+
75+
if (out.length() > 0) {
76+
out.append(' ');
77+
}
78+
79+
out.append(msg.getMessage());
80+
String str = out.toString();
81+
log.info("Sending plain message: " + level + ", " + str);
82+
syslog.log(level, str);
83+
}
84+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.wizecore.graylog2.plugin;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.logging.Logger;
6+
7+
import org.graylog2.plugin.Message;
8+
import org.graylog2.syslog4j.SyslogIF;
9+
import org.graylog2.syslog4j.impl.message.structured.StructuredSyslogMessage;
10+
11+
public class StructuredSender implements MessageSender {
12+
private Logger log = Logger.getLogger(StructuredSender.class.getName());
13+
14+
@Override
15+
public void send(SyslogIF syslog, int level, Message msg) {
16+
Map<String, Map<String, String>> data = new HashMap<String, Map<String,String>>();
17+
Map<String, Object> fields = msg.getFields();
18+
for (String key: fields.keySet()) {
19+
Map<String,String> inner = new HashMap<String, String>();
20+
inner.put(key, fields.get(key).toString());
21+
data.put(key, inner);
22+
}
23+
24+
log.info("Sending " + level + ", " + msg.getId() + ", " + msg.getSource() + ", " + data + ", " + msg.getMessage());
25+
syslog.log(level, new StructuredSyslogMessage(msg.getId(), msg.getSource(), data, msg.getMessage()));
26+
}
27+
}

0 commit comments

Comments
 (0)