Once the solution is based on SOA, there can be a need to have a centralized logging facility where each of the service would be using log agents to send logs to a cluster of centralized log server. This can be done via various manners using log4J framework by making use of one of the following appenders:
1. SysLogD
2. JMSAppenders
JMSAppender could be used within Log agents to send logs to a messaging bus from where message could be retrieved by store agents on centralized log server.
Further to that, the message once retrieved from the Message bus would be watched for warnings or exceptions for purpose of generating alerts which could be informed to admin via SMS or email.
This can be done by integrating centralized log server with OpenNMS. This is done based on following:
1. The incoming messages is watched for exception/warning messages.
2. Once these messages are found, the event is created and send as an XML document to OpenNMS eventD plugin on a TCP socket. EventD listens on port such as 5817 by default. This port needs to be opened for external system such as centralized log server to send message using Sockets.
Following class could be used to send message using Socket:
1. SysLogD
2. JMSAppenders
JMSAppender could be used within Log agents to send logs to a messaging bus from where message could be retrieved by store agents on centralized log server.
Further to that, the message once retrieved from the Message bus would be watched for warnings or exceptions for purpose of generating alerts which could be informed to admin via SMS or email.
This can be done by integrating centralized log server with OpenNMS. This is done based on following:
1. The incoming messages is watched for exception/warning messages.
2. Once these messages are found, the event is created and send as an XML document to OpenNMS eventD plugin on a TCP socket. EventD listens on port such as 5817 by default. This port needs to be opened for external system such as centralized log server to send message using Sockets.
Following class could be used to send message using Socket:
he Code
package com.company.onms.monitor;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author apaxson
*/
public class OnmsEvent {
private String uei;
private String source;
private int nodeid;
private String time;
private String host;
private Map parms = new HashMap();
public OnmsEvent(String uei, int nodeid, String host, String source) {
setUei(uei);
setNodeid(nodeid);
setHost(host);
setSource(source);
Date currentTime = Calendar.getInstance().getTime();
DateFormat dformat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
dformat.setTimeZone(TimeZone.getTimeZone("GMT"));
setTime(dformat.format(currentTime));
}
protected String getUei() {
return uei;
}
protected void setUei(String uei) {
this.uei = uei;
}
protected String getSource() {
return source;
}
protected void setSource(String source) {
this.source = source;
}
protected int getNodeid() {
return nodeid;
}
protected void setNodeid(int nodeid) {
this.nodeid = nodeid;
}
protected String getTime() {
return time;
}
protected void setTime(String time) {
this.time = time;
}
protected String getHost() {
return host;
}
protected void setHost(String host) {
this.host = host;
}
public void addParm(String key, String value) {
parms.put(key, value);
}
@SuppressWarnings(value = "unchecked")
protected Map<String, String> getParms() {
return parms;
}
protected String toXml() {
StringBuffer data = new StringBuffer();
data.append("<log>");
data.append("<events>");
data.append("<event>");
data.append("<uei>" + getUei() + "</uei>");
data.append("<source>" + getSource() + "</source>");
data.append("<nodeid>" + getNodeid() + "</nodeid>");
data.append("<time>" + getTime() + "</time>");
data.append("<host>" + getHost() + "</host>");
data.append("<parms>");
// Cycle through each parameter
for (Map.Entry<String, String> e : getParms().entrySet()) {
data.append("<parm>");
data.append("<parmName>");
data.append("<![CDATA[" + e.getKey() + "]]></parmName>");
data.append("<value type=\"string\" encoding=\"text\"><![CDATA[" + e.getValue() + "]]></value>");
data.append("</parm>");
}
data.append("</parms>");
data.append("</event>");
data.append("</events>");
data.append("</log>");
return data.toString();
}
/**
* TODO Remember to change the hardcoded address 2.3.4.5 to your address for onms.
* Preferrably, place this in a config file somewhere
*/
public void sendEvent(String xmlData) {
//TODO check to make sure xmlData isn't null before creating socket
//TODO make some useful logging functions here, rather than println
Socket socket = null;
try {
System.out.println("Sending data");
socket = new Socket("2.3.4.5", 5817);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(xmlData);
System.out.println("Sending data complete");
} catch (UnknownHostException ex) {
System.out.println("Unknown host");
} catch (IOException ex) {
System.out.println("I/O Exception while creating socket");
} finally {
try {
socket.close();
} catch (IOException ex) {
System.out.println("I/O Exception when closing socket");
}
}
}
}
The Usage
Okay, so to use this new class, you create the object, and set the data. As such:
OnmsEvent event = new OnmsEvent("uei.company.com/application/logFileTableLoadError",26,"test.host.com", "ServerLogMonitor");
event.addParm("file", "logfile001.log");
event.addParm("content","Disregard... testing only");
event.sendEvent(event.toXml());