package com.ctrip.framework.apollo.common.customize;
import com.google.common.base.Strings;
import com.ctrip.framework.apollo.tracer.Tracer;
import com.ctrip.framework.foundation.Foundation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.Appender;
/**
* clogging config.only used in ctrip
* @author Jason Song(song_s@ctrip.com)
*/
public abstract class LoggingCustomizer implements InitializingBean {
private static final Logger logger = LoggerFactory.getLogger(LoggingCustomizer.class);
private static final String cLoggingAppenderClass =
"com.ctrip.framework.clogging.agent.appender.CLoggingAppender";
private static boolean cLoggingAppenderPresent =
ClassUtils.isPresent(cLoggingAppenderClass, LoggingCustomizer.class.getClassLoader());
@Override
public void afterPropertiesSet() {
if (!cLoggingAppenderPresent) {
return;
}
try {
tryConfigCLogging();
} catch (Throwable ex) {
logger.error("Config CLogging failed", ex);
Tracer.logError(ex);
}
}
private void tryConfigCLogging() throws Exception {
String appId = Foundation.app().getAppId();
if (Strings.isNullOrEmpty(appId)) {
logger.warn("App id is null or empty!");
return;
}
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Class clazz = Class.forName(cLoggingAppenderClass);
Appender cLoggingAppender = (Appender) clazz.newInstance();
ReflectionUtils.findMethod(clazz, "setAppId", String.class).invoke(cLoggingAppender, appId);
ReflectionUtils.findMethod(clazz, "setServerIp", String.class)
.invoke(cLoggingAppender, cloggingUrl());
ReflectionUtils.findMethod(clazz, "setServerPort", int.class)
.invoke(cLoggingAppender, Integer.parseInt(cloggingPort()));
cLoggingAppender.setName("CentralLogging");
cLoggingAppender.setContext(loggerContext);
cLoggingAppender.start();
ch.qos.logback.classic.Logger logger =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger("root");
logger.addAppender(cLoggingAppender);
}
/**
* clogging server url
* @return
*/
protected abstract String cloggingUrl();
/**
* clogging server port
* @return
*/
protected abstract String cloggingPort();
}