package com.google.code.joto.eventrecorder.spy.log;
import java.util.Date;
import java.util.Map;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.core.AppenderBase;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.eventrecorder.writer.RecordEventWriter;
/**
*
*/
public class EventStoreWriterLogbackAppender extends AppenderBase<ILoggingEvent> {
private RecordEventWriter eventWriter;
private String eventType = LogbackEventData.EVENT_TYPE;
protected boolean enable = true;
protected int minimumLevel = Level.ALL_INT;
// -------------------------------------------------------------------------
public EventStoreWriterLogbackAppender(RecordEventWriter eventWriter, String eventType) {
super();
this.eventWriter = eventWriter;
this.eventType = eventType;
}
// -------------------------------------------------------------------------
public boolean isEnable() {
return enable;
}
public void setEnable(boolean p) {
this.enable = p;
}
public int getMinimumLevel() {
return minimumLevel;
}
public void setMinimumLevel(int p) {
this.minimumLevel = p;
}
public void setMinimumLevel(Level p) {
this.minimumLevel = (p != null)? p.toInt() : Level.ALL_INT;
}
// implements AppenderBase
// ------------------------------------------------------------------------
@Override
public void start() {
// cf logback 0.9.17 ?
// if (this.layout == null) {
// addError("No layout set for the appender named [" + name + "].");
// return;
// }
super.start();
}
@Override
protected void append(ILoggingEvent p) {
if (!enable || eventWriter == null || !eventWriter.isEnable()) {
return;
}
Level logLevel = p.getLevel();
if (logLevel.toInt() < minimumLevel) {
return;
}
RecordEventSummary eventInfo = new RecordEventSummary(-1);
eventInfo.setEventType(eventType);
eventInfo.setThreadName(p.getThreadName());
eventInfo.setEventDate(new Date(p.getTimeStamp()));
eventInfo.setEventClassName(p.getLoggerName());
eventInfo.setEventMethodName(logLevel.toString().toLowerCase());
// use message instead of formattedMessage for header!!
// => use "... {0} .. {1} .." to compress event summary encoding
eventInfo.setEventMethodDetail(p.getMessage());
if (!eventWriter.isEnable(eventInfo)) {
return;
}
LogbackEventData eventData = new LogbackEventData();
eventData.setLevel(eventInfo, logLevel.toString());
eventData.setFormattedMessage(p.getFormattedMessage());
eventData.setArgumentArray(p.getArgumentArray());
if (p.getThrowableProxy() != null) {
IThrowableProxy throwableProxy = p.getThrowableProxy();
// throwableProxy.getClassName()
// throwableProxy.getMessage()
StackTraceElementProxy[] traceElts = throwableProxy.getStackTraceElementProxyArray();
eventData.setStackTraceElements(traceElts);
}
Map<String,String> mdcPropertyMap = p.getMDCPropertyMap();
if (mdcPropertyMap != null && !mdcPropertyMap.isEmpty()) {
eventData.setMDCPropertyMap(mdcPropertyMap);
}
eventWriter.addEvent(eventInfo , eventData, null);
}
}