package com.dianping.pigeon.log;
import com.dianping.pigeon.extension.ExtensionLoader;
import org.apache.commons.lang.StringUtils;
import java.lang.reflect.Constructor;
public class LoggerLoader {
private static final String LOG_ROOT_KEY = "pigeon.log.dir";
private static final String LOG_ROOT_DEFAULT = "/data/applogs/pigeon";
public static String LOG_ROOT;
private static LoggerInitializer loggerInitializer = ExtensionLoader.newExtension(LoggerInitializer.class);
static {
if (StringUtils.isBlank(System.getProperty(LOG_ROOT_KEY))) {
System.setProperty(LOG_ROOT_KEY, LOG_ROOT_DEFAULT);
}
LOG_ROOT = System.getProperty(LOG_ROOT_KEY);
if (loggerInitializer == null) {
loggerInitializer = new InnerLoggerInitializer();
}
loggerInitializer.init();
}
public static Logger getLogger(Class clazz) {
return getLogger(clazz.getName());
}
public static Logger getLogger(String loggerName) {
return loggerInitializer.getLogger(loggerName);
}
private static class InnerLoggerInitializer implements LoggerInitializer {
private static Constructor logConstructor;
@Override
public void init() {
String logType = System.getProperty("pigeon.logType");
if (logType != null) {
if (logType.equalsIgnoreCase("slf4j")) {
tryImplementation("org.slf4j.Logger", "com.dianping.pigeon.log.Slf4jLogger");
} else if (logType.equalsIgnoreCase("log4j2")) {
tryImplementation("org.apache.logging.log4j.Logger", "com.dianping.pigeon.log.Log4j2Logger");
} else if (logType.equalsIgnoreCase("simple")) {
tryImplementation(null, "com.dianping.pigeon.log.SimpleLogger");
} else if (logType.equalsIgnoreCase("null")) {
tryImplementation(null, "com.dianping.pigeon.log.NullLogger");
}
}
// log4j2 > slf4j > simple > null
tryImplementation("org.apache.logging.log4j.Logger", "com.dianping.pigeon.log.Log4j2Logger");
tryImplementation("org.slf4j.Logger", "com.dianping.pigeon.log.Slf4jLogger");
if (logConstructor == null) {
try {
logConstructor = SimpleLogger.class.getConstructor(String.class);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}
@Override
public Logger getLogger(String loggerName) {
try {
return (Logger) logConstructor.newInstance(loggerName);
} catch (Throwable t) {
throw new RuntimeException("failed to create logger for " + loggerName + ", cause: " + t, t);
}
}
@SuppressWarnings("unchecked")
private static void tryImplementation(String testClassName, String implClassName) {
if (logConstructor != null) {
return;
}
try {
if(testClassName != null) {
Resources.classForName(testClassName);
}
Class implClass = Resources.classForName(implClassName);
logConstructor = implClass.getConstructor(new Class[] {
String.class
});
Class<?> declareClass = logConstructor.getDeclaringClass();
if (!Logger.class.isAssignableFrom(declareClass)) {
logConstructor = null;
}
try {
if (null != logConstructor) {
logConstructor.newInstance(LoggerLoader.class.getName());
}
} catch (Throwable t) {
t.printStackTrace();
logConstructor = null;
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
}