package org.sef4j.log.slf4j.slf4j2event;
import java.util.Map;
import org.sef4j.callstack.CallStackElt;
import org.sef4j.callstack.LocalCallStack;
import org.sef4j.log.slf4j.LogLevel;
import org.sef4j.log.slf4j.Slf4jLoggerUtil;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;
public class Slf4jToLoggingEventExtMapper {
public LoggingEventExt slf4jEventToEvent(ILoggingEvent slf4jEvent) {
LoggingEventExt.Builder evtB = new LoggingEventExt.Builder();
evtB.withTimeStamp(slf4jEvent.getTimeStamp());
evtB.withLevel(Slf4jLoggerUtil.slf4jLevelToLogLevel(slf4jEvent.getLevel()));
evtB.withThreadName(slf4jEvent.getThreadName());
evtB.withLoggerName(slf4jEvent.getLoggerName());
evtB.withMessage(slf4jEvent.getMessage());
evtB.withArgumentArray(slf4jEvent.getArgumentArray());
evtB.withFormattedMessage(slf4jEvent.getFormattedMessage());
IThrowableProxy throwableProxy = slf4jEvent.getThrowableProxy();
if(throwableProxy != null) {
evtB.withThrowable(throwableProxy);
}
// *** also complete with current LocalCallStack ***
fillWithCurrLocalCallStackProps(evtB, true, true, true);
LoggingEventExt evt = evtB.build();
return evt;
}
public static LoggingEventExt buildEvent(String loggerName,
LogLevel logLevel, String text, String templateText,
boolean fillCallStackPath, boolean fillInheritedProps, boolean fillParams,
Map<String, Object> values, Throwable ex) {
LoggingEventExt.Builder evtB = new LoggingEventExt.Builder();
evtB.withTimeStamp(System.currentTimeMillis());
evtB.withLevel(logLevel);
evtB.withThreadName(Thread.currentThread().getName());
evtB.withLoggerName(loggerName);
evtB.withMessage(templateText);
// evtB.withArgumentArray(argumentArray);
evtB.withFormattedMessage(text);
if (ex != null) {
IThrowableProxy throwableProxy = new ThrowableProxy(ex);
evtB.withThrowable(throwableProxy);
}
// *** also complete with current LocalCallStack ***
fillWithCurrLocalCallStackProps(evtB, fillCallStackPath, fillInheritedProps, fillParams);
// override with explicit name-values
if (values != null && !values.isEmpty()) {
evtB.withParams(values);
}
LoggingEventExt evt = evtB.build();
return evt;
}
/**
* complete with current LocalCallStack = thread info, info not in slf4j .. should not use AsyncAppender to wrap this appender !
* @param evtB
*/
public static void fillWithCurrLocalCallStackProps(LoggingEventExt.Builder evtB,
boolean fillCallStackPath, boolean fillInheritedProps, boolean fillParams) {
CallStackElt currThreadStackElt = LocalCallStack.currThreadStackElt();
if (fillCallStackPath) {
String[] path = currThreadStackElt.getPath();
evtB.withCallStackPath(path);
}
if (fillInheritedProps) {
Map<String, Object> inheritedProps = currThreadStackElt.getInheritedProps();
if (inheritedProps != null && !inheritedProps.isEmpty()) {
evtB.withProps(inheritedProps);
}
}
if (fillParams) {
Map<String, Object> params = currThreadStackElt.getParams();
if (params != null && !params.isEmpty()) {
evtB.withParams(params);
}
}
}
}