package com.google.code.joto.eventrecorder.spy.log;
import java.io.PrintStream;
import java.text.MessageFormat;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.eventrecorder.processor.RecordEventsProcessor;
import com.google.code.joto.eventrecorder.processor.RecordEventsProcessorFactory;
/**
* Processor for handling RecordEventSummary+Object eventData,
* when Type is a LogEventData... and reformat it as a Log4j event message
*/
public class Log4jFormatEventRecordEventsProcessor implements RecordEventsProcessor {
public static class Factory implements RecordEventsProcessorFactory<PrintStream> {
MessageFormat messageFormat;
public Factory(MessageFormat messageFormat) {
super();
this.messageFormat = messageFormat;
}
@Override
public RecordEventsProcessor create(PrintStream out) {
return new Log4jFormatEventRecordEventsProcessor(messageFormat, out);
}
}
// -------------------------------------------------------------------------
private PrintStream out;
/**
* use:
*
* {0} date
* {1} threadName
* {2} severity
* {3} loggerName
* {4} msg
*
* default value: DEFAULT_MESSAGE_FORMAT
*/
private MessageFormat messageFormat = DEFAULT_MESSAGE_FORMAT;
private static final MessageFormat DEFAULT_MESSAGE_FORMAT =
new MessageFormat("{0} [{1}] {2} {3} {4}");
//-------------------------------------------------------------------------
public Log4jFormatEventRecordEventsProcessor(MessageFormat messageFormat, PrintStream out) {
this.messageFormat = messageFormat;
this.out = out;
}
//-------------------------------------------------------------------------
@Override
public boolean needEventObjectData() {
return true;
}
@Override
public void processEvent(RecordEventSummary event, Object eventObjectData) {
Log4jEventData eventData = (Log4jEventData) eventObjectData;
Object args= new Object[] {
event.getEventDate(),
event.getThreadName(),
event.getEventSubType(),
event.getEventMethodName(),
event.getEventMethodDetail()
};
String logEventText = messageFormat.format(args);
out.println(logEventText);
if (eventData.getThrowable() != null) {
eventData.getThrowable().printStackTrace(out);
} else if (eventData.getThrowableStrRep() != null) {
String[] lines = eventData.getThrowableStrRep();
for (String line : lines) {
out.println(line);
}
}
}
}