package ilarkesto.logging;
import ilarkesto.base.Str;
import ilarkesto.core.logging.Log;
import org.apache.log4j.Appender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.ErrorHandler;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
public class Log4jLogging {
private static Log log = Log.get(Log4jLogging.class);
public static void redirectToLoggers() {
Logger rootLogger = Logger.getRootLogger();
rootLogger.removeAllAppenders();
rootLogger.addAppender(new LoggerRedirectionAppender());
log.debug("Redirecting Log4j Logging to ilarkesto loggers");
}
private static void redirectToLogger(LoggingEvent event) {
String loggerName = event.getLoggerName();
int idx = loggerName.lastIndexOf('.');
if (idx > 0) {
loggerName = loggerName.substring(idx + 1);
}
Log logger = Log.get(loggerName);
logger.log(toLevel(event.getLevel()), getMessage(event));
}
public static String getMessage(LoggingEvent event) {
return Str.format(event.getMessage());
}
public static Log.Level toLevel(Level log4jLevel) {
if (log4jLevel == Level.TRACE || log4jLevel == Level.DEBUG || log4jLevel == Level.OFF
|| log4jLevel == Level.INFO) {
return Log.Level.DEBUG;
} else if (log4jLevel == Level.WARN) {
return Log.Level.WARN;
} else if (log4jLevel == Level.FATAL) {
return Log.Level.FATAL;
} else {
return Log.Level.INFO;
}
}
static class LoggerRedirectionAppender implements Appender {
private ErrorHandler errorHandler;
private String name;
private Layout layout;
private Filter filter;
@Override
public void doAppend(LoggingEvent event) {
redirectToLogger(event);
}
@Override
public void close() {
Log.flush();
}
@Override
public void addFilter(Filter filter) {
this.filter = filter;
}
@Override
public void clearFilters() {
filter = null;
}
@Override
public Filter getFilter() {
return filter;
}
@Override
public boolean requiresLayout() {
return false;
}
@Override
public void setLayout(Layout layout) {
this.layout = layout;
}
@Override
public Layout getLayout() {
return layout;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public void setErrorHandler(ErrorHandler handler) {
this.errorHandler = handler;
}
@Override
public ErrorHandler getErrorHandler() {
return errorHandler;
}
}
}