package com.baasbox.service.logging;
import org.apache.commons.lang.time.FastDateFormat;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.ThrowableProxyUtil;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import com.baasbox.BBInternalConstants;
import com.baasbox.service.events.EventsService;
import com.baasbox.service.events.EventsService.StatType;
public class BaasBoxEvenSourceAppender<E> extends UnsynchronizedAppenderBase<E>{
private final FastDateFormat sdf = FastDateFormat.getInstance(BBInternalConstants.DATE_FORMAT_STRING);
public static final String name = "BaasBoxAppender";
public static final BaasBoxEvenSourceAppender<ILoggingEvent> appender = new BaasBoxEvenSourceAppender<ILoggingEvent>();
protected BaasBoxEvenSourceAppender(){
super();
this.setName(name);
this.start();
}
@Override
protected void append(E message) {
//TODO: this must be done in background to avoid blocking and/or performance issues
String toSend=formattedMessage((ILoggingEvent)message);
toSend=toSend.replace("\n", "<br>");
//System.out.println("****BAASBOX_APPENDER***: " + toSend);
EventsService.publish(StatType.SYSTEM_LOGGER, toSend);
}
protected String formattedMessage(ILoggingEvent message){
StringBuilder sb = new StringBuilder();
sb.append("\n").append(sdf.format(message.getTimeStamp())).append(" - ");
sb.append('[').append(message.getLevel()).append("] ");
sb.append(" - ").append(message.getFormattedMessage());
if (message.getThrowableProxy() != null)
sb.append("\n").append(ThrowableProxyUtil.asString(message.getThrowableProxy()));
return sb.toString();
}
public String addClassetoLevel(ILoggingEvent event) {
switch (event.getLevel().levelInt){
case Level.TRACE_INT:
return "<span class=\"log trace\">[trace]</span>";
case Level.DEBUG_INT:
return "<span class=\"log debug\">[debug]</span>";
case Level.INFO_INT:
return "<span class=\"log info\">[info ]</span>";
case Level.WARN_INT:
return "<span class=\"log warn\">[warn ]</span>";
case Level.ERROR_INT:
return "<span class=\"log error\">[error]</span>";
default:
return "<span class=\"log default\">["+event.getLevel().levelStr+"]</span>";
}
}
}