package com.google.code.joto.eventrecorder.spy.log;
import java.util.Date;
import java.util.Map;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.eventrecorder.writer.RecordEventWriter;
import com.google.code.joto.util.io.SerializableUtil;
/**
* Spi Extension of EventRecorderStore, for storing log4j events as events
*
*/
public class EventStoreWriterLog4jAppender extends AppenderSkeleton {
private RecordEventWriter eventWriter;
private String eventType = Log4jEventData.EVENT_TYPE;
// private String eventSubType => used for logEvent message severity
// -------------------------------------------------------------------------
public EventStoreWriterLog4jAppender(RecordEventWriter eventWriter, String eventType) {
super();
this.eventWriter = eventWriter;
this.eventType = eventType;
}
// -------------------------------------------------------------------------
@Override
public void close() {
eventWriter = null;
}
@Override
public boolean requiresLayout() {
return false;
}
@Override
protected void append(LoggingEvent p) {
if (eventWriter == null || !eventWriter.isEnable()) {
return;
}
RecordEventSummary eventInfo = new RecordEventSummary(-1);
eventInfo.setEventType(eventType);
eventInfo.setEventSubType(p.getLevel().toString());
eventInfo.setThreadName(p.getThreadName());
eventInfo.setEventDate(new Date(p.getTimeStamp()));
eventInfo.setEventMethodName(p.getLoggerName());
eventInfo.setEventMethodDetail(p.getRenderedMessage());
if (!eventWriter.isEnable(eventInfo)) {
return;
}
// filla additionnal LoggingEvent values in eventData
Log4jEventData eventData = new Log4jEventData();
if (p.getThrowableInformation() != null) {
Throwable throwable = p.getThrowableInformation().getThrowable();
if (SerializableUtil.checkSerializable(throwable)) {
eventData.setThrowable(throwable);
} else {
// set only when throwable is not serializable? ... otherwise redundant with Throwable...
String[] throwableStrRep = p.getThrowableStrRep();
eventData.setThrowableStrRep(throwableStrRep);
}
}
@SuppressWarnings("unchecked")
Map<String,String> properties = p.getProperties();
if (properties != null && !properties.isEmpty()) {
eventData.setProperties(properties);
}
String ndc = p.getNDC();
if (ndc != null) {
// TODO?? NDC. should be / be-converted to String[] ??
eventData.setNdcStrRep(ndc);
}
eventWriter.addEvent(eventInfo , eventData, null);
}
}