package net.sf.openrocket.logging;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.AppenderBase;
public class LogbackBufferLoggerAdaptor extends AppenderBase<ILoggingEvent> {
private final DelegatorLogger logHelper;
private final LogLevelBufferLogger logBuffer;
private static final int LOG_BUFFER_LENGTH = 50;
public LogbackBufferLoggerAdaptor(int bufferLength) {
logHelper = new DelegatorLogger();
logBuffer = new LogLevelBufferLogger(bufferLength);
logHelper.addLogger(logBuffer);
}
public LogbackBufferLoggerAdaptor() {
this(LOG_BUFFER_LENGTH);
}
DelegatorLogger getLogHelper() {
return logHelper;
}
LogLevelBufferLogger getLogBuffer() {
return logBuffer;
}
@Override
protected void append(ILoggingEvent e) {
LogLine ll = toLogLine(e);
logHelper.log(ll);
}
private LogLevel toORLevel(Level l) {
switch (l.toInt()) {
case Level.TRACE_INT:
return LogLevel.VBOSE;
case Level.DEBUG_INT:
return LogLevel.DEBUG;
case Level.INFO_INT:
return LogLevel.INFO;
case Level.WARN_INT:
return LogLevel.WARN;
case Level.ERROR_INT:
return LogLevel.ERROR;
default:
return LogLevel.ERROR;
}
}
private LogLine toLogLine(ILoggingEvent e) {
LogLevel l = toORLevel(e.getLevel());
if (Markers.USER_MARKER.equals(e.getMarker()))
l = LogLevel.USER;
if (Markers.STDERR_MARKER.equals(e.getMarker()))
l = LogLevel.STDERR;
Throwable t = null;
if (e.getThrowableProxy() != null) {
t = ((ThrowableProxy) e.getThrowableProxy()).getThrowable();
}
return new LogLine(l, new TraceException(), e.getFormattedMessage(), t);
}
}