package cz.cuni.mff.d3s.been.logging;
import java.util.ServiceLoader;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
/**
* Logback appender to BEEN shared memory
*
* @author darklight
*/
public class BeenAppender extends AppenderBase<ILoggingEvent> {
private final LogLevelConverter levelConverter;
private final ServiceLogHandler logHandler;
/**
* Creates new BeenAppender.
*/
public BeenAppender() {
logHandler = ServiceLoader.load(ServiceLogHandler.class).iterator().next();
levelConverter = new LogLevelConverter();
}
@Override
protected void append(ILoggingEvent eventObject) {
if (logHandler == null) {
System.err.println(String.format(
"Could not log following message, because no '%s' instance was found:\n%s",
ServiceLogHandler.class.getSimpleName(),
eventObject.getMessage()));
}
final String loggerName = eventObject.getLoggerName();
// workaround for issue #188
if (loggerName != null && loggerName.startsWith("com.hazelcast")) {
return;
}
final LogMessage message = new LogMessage();
message.setLevel(levelConverter.getBeenLogLevel(eventObject.getLevel()));
message.setMessage(eventObject.getFormattedMessage());
message.setName(eventObject.getLoggerName());
message.setThreadName(eventObject.getThreadName());
final StringBuilder traceBuilder = new StringBuilder();
for (StackTraceElement traceElm : eventObject.getCallerData()) {
traceBuilder.append(traceElm.toString());
traceBuilder.append(Character.LINE_SEPARATOR);
}
message.setErrorTrace(traceBuilder.toString());
try {
logHandler.log(message);
} catch (Exception e) {
System.err.println(String.format(
"Could not log following message because of an exception:\n%s",
message.toString()));
e.printStackTrace();
}
}
}