Skip to content

Commit

Permalink
优雅挂逼
Browse files Browse the repository at this point in the history
日志适配
  • Loading branch information
YunaiV committed May 31, 2018
1 parent 29d3b8e commit 6cd742f
Show file tree
Hide file tree
Showing 36 changed files with 159 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package com.alibaba.dubbo.common.logger;

/**
* Level
* Level 日志级别
*/
public enum Level {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@

/**
* Logger interface
*
* Logger 接口
*
* <p>
* This interface is referred from commons-logging
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

/**
* Logger provider
*
* Logger 适配器接口
*/
@SPI
public interface LoggerAdapter {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,22 @@
*/
public class LoggerFactory {

/**
* 已创建的 Logger 对应的映射
*
* key:类名
*/
private static final ConcurrentMap<String, FailsafeLogger> LOGGERS = new ConcurrentHashMap<String, FailsafeLogger>();
/**
* 当前使用的 LoggerAdapter 日志适配器
*/
private static volatile LoggerAdapter LOGGER_ADAPTER;

// search common-used logging frameworks
static {
// 获得 "logger" 配置项
String logger = System.getProperty("dubbo.application.logger");
// 根据配置项,进行对应的 LoggerAdapter 对象
if ("slf4j".equals(logger)) {
setLoggerAdapter(new Slf4jLoggerAdapter());
} else if ("jcl".equals(logger)) {
Expand All @@ -48,6 +58,7 @@ public class LoggerFactory {
} else if ("jdk".equals(logger)) {
setLoggerAdapter(new JdkLoggerAdapter());
} else {
// 未配置,按照 log4j > slf4j > apache common logger > jdk logger
try {
setLoggerAdapter(new Log4jLoggerAdapter());
} catch (Throwable e1) {
Expand Down Expand Up @@ -80,9 +91,12 @@ public static void setLoggerAdapter(String loggerAdapter) {
*/
public static void setLoggerAdapter(LoggerAdapter loggerAdapter) {
if (loggerAdapter != null) {
// 获得 Logger 对象,并打印日志,提示设置后的 LoggerAdapter 实现类
Logger logger = loggerAdapter.getLogger(LoggerFactory.class.getName());
logger.info("using logger: " + loggerAdapter.getClass().getName());
// 设置 LOGGER_ADAPTER 属性
LoggerFactory.LOGGER_ADAPTER = loggerAdapter;
// 循环,将原有已经生成的 LOGGER 缓存对象,全部重新生成替换
for (Map.Entry<String, FailsafeLogger> entry : LOGGERS.entrySet()) {
entry.getValue().setLogger(LOGGER_ADAPTER.getLogger(entry.getKey()));
}
Expand All @@ -96,7 +110,9 @@ public static void setLoggerAdapter(LoggerAdapter loggerAdapter) {
* @return logger
*/
public static Logger getLogger(Class<?> key) {
// 从缓存中,获得 Logger 对象
FailsafeLogger logger = LOGGERS.get(key.getName());
// 不存在,则进行创建,并进行缓存
if (logger == null) {
LOGGERS.putIfAbsent(key.getName(), new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
logger = LOGGERS.get(key.getName());
Expand All @@ -111,7 +127,9 @@ public static Logger getLogger(Class<?> key) {
* @return logger provider
*/
public static Logger getLogger(String key) {
// 从缓存中,获得 Logger 对象
FailsafeLogger logger = LOGGERS.get(key);
// 不存在,则进行创建,并进行缓存
if (logger == null) {
LOGGERS.putIfAbsent(key, new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
logger = LOGGERS.get(key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,4 @@ public void setFile(File file) {
this.file = file;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ public void warn(String msg, Throwable e) {
logger.log(FQCN, Level.WARN, msg, e);
}

@Override
public void error(String msg) {
logger.log(FQCN, Level.ERROR, msg, null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,27 @@
import java.io.File;
import java.util.Enumeration;

/**
* Log4j 的 LoggerAdapter 实现类
*/
public class Log4jLoggerAdapter implements LoggerAdapter {

/**
* Root Logger 的文件,在构造方法中初始化
*/
private File file;

@SuppressWarnings("unchecked")
public Log4jLoggerAdapter() {
try {
// 获得 Root Logger 对象
org.apache.log4j.Logger logger = LogManager.getRootLogger();
if (logger != null) {
// 循环每个 Logger 对象的 Appender 对象
Enumeration<Appender> appenders = logger.getAllAppenders();
if (appenders != null) {
while (appenders.hasMoreElements()) {
// 当且仅当 FileAppender 时
Appender appender = appenders.nextElement();
if (appender instanceof FileAppender) {
FileAppender fileAppender = (FileAppender) appender;
Expand Down Expand Up @@ -87,28 +96,33 @@ private static Level fromLog4jLevel(org.apache.log4j.Level level) {
return Level.OFF;
}

@Override
public Logger getLogger(Class<?> key) {
return new Log4jLogger(LogManager.getLogger(key));
}

@Override
public Logger getLogger(String key) {
return new Log4jLogger(LogManager.getLogger(key));
}

@Override
public Level getLevel() {
return fromLog4jLevel(LogManager.getRootLogger().getLevel());
}

@Override
public void setLevel(Level level) {
LogManager.getRootLogger().setLevel(toLog4jLevel(level));
}

@Override
public File getFile() {
return file;
}

@Override
public void setFile(File file) {

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,28 +27,34 @@ public class Slf4jLoggerAdapter implements LoggerAdapter {
private Level level;
private File file;

@Override
public Logger getLogger(String key) {
return new Slf4jLogger(org.slf4j.LoggerFactory.getLogger(key));
}

@Override
public Logger getLogger(Class<?> key) {
return new Slf4jLogger(org.slf4j.LoggerFactory.getLogger(key));
}

public Level getLevel() {
@Override
public Level getLevel() { // 无用
return level;
}

public void setLevel(Level level) {
@Override
public void setLevel(Level level) { // 无用
this.level = level;
}

public File getFile() {
@Override
public File getFile() { // 无用
return file;
}

public void setFile(File file) {
@Override
public void setFile(File file) { // 无用
this.file = file;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@

public class FailsafeLogger implements Logger {

/**
* Dubbo Logger 对象
*/
private Logger logger;

public FailsafeLogger(Logger logger) {
Expand Down Expand Up @@ -117,6 +120,7 @@ public void error(String msg, Throwable e) {
}
}

@Override
public void error(String msg) {
try {
logger.error(appendContextMessage(msg));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,13 +313,17 @@ public static int getPid() {

@SuppressWarnings("deprecation")
public static int getServerShutdownTimeout() {
// 默认,10 * 1000 毫秒
int timeout = Constants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT;
// 获得 "dubbo.service.shutdown.wait" 配置项,单位:毫秒
String value = ConfigUtils.getProperty(Constants.SHUTDOWN_WAIT_KEY);
if (value != null && value.length() > 0) {
try {
timeout = Integer.parseInt(value);
} catch (Exception e) {
}
// 若为空,获得 "dubbo.service.shutdown.wait.seconds" 配置项,单位:秒。
// ps:目前已经废弃该参数,推荐使用 "dubbo.service.shutdown.wait"
} else {
value = ConfigUtils.getProperty(Constants.SHUTDOWN_WAIT_SECONDS_KEY);
if (value != null && value.length() > 0) {
Expand All @@ -329,7 +333,7 @@ public static int getServerShutdownTimeout() {
}
}
}

// 返回
return timeout;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,27 @@
import java.util.concurrent.TimeUnit;

public class ExecutorUtil {

private static final Logger logger = LoggerFactory.getLogger(ExecutorUtil.class);

private static final ThreadPoolExecutor shutdownExecutor = new ThreadPoolExecutor(0, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(100),
new NamedThreadFactory("Close-ExecutorService-Timer", true));

public static boolean isShutdown(Executor executor) {
if (executor instanceof ExecutorService) {
if (((ExecutorService) executor).isShutdown()) {
return true;
}
return ((ExecutorService) executor).isShutdown();
}
return false;
}

public static void gracefulShutdown(Executor executor, int timeout) {
// 忽略,若不是 ExecutorService ,或者已经关闭
if (!(executor instanceof ExecutorService) || isShutdown(executor)) {
return;
}
// 关闭,禁止新的任务提交,将原有任务执行完
final ExecutorService es = (ExecutorService) executor;
try {
es.shutdown(); // Disable new tasks from being submitted
Expand All @@ -55,23 +57,28 @@ public static void gracefulShutdown(Executor executor, int timeout) {
} catch (NullPointerException ex2) {
return;
}
// 等待原有任务执行完。若等待超时,强制结束所有任务
try {
if (!es.awaitTermination(timeout, TimeUnit.MILLISECONDS)) {
es.shutdownNow();
}
} catch (InterruptedException ex) {
// 发生 InterruptedException 异常,也强制结束所有任务
es.shutdownNow();
Thread.currentThread().interrupt();
}
// 若未关闭成功,新开线程去关闭
if (!isShutdown(es)) {
newThreadToCloseExecutor(es);
}
}

public static void shutdownNow(Executor executor, final int timeout) {
// 忽略,若不是 ExecutorService ,或者已经关闭
if (!(executor instanceof ExecutorService) || isShutdown(executor)) {
return;
}
// 立即关闭,包括原有任务也打断
final ExecutorService es = (ExecutorService) executor;
try {
es.shutdownNow();
Expand All @@ -80,11 +87,13 @@ public static void shutdownNow(Executor executor, final int timeout) {
} catch (NullPointerException ex2) {
return;
}
// 等待原有任务被打断完成
try {
es.awaitTermination(timeout, TimeUnit.MILLISECONDS);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
// 若未关闭成功,新开线程去关闭
if (!isShutdown(es)) {
newThreadToCloseExecutor(es);
}
Expand All @@ -95,8 +104,11 @@ private static void newThreadToCloseExecutor(final ExecutorService es) {
shutdownExecutor.execute(new Runnable() {
public void run() {
try {
// 循环 1000 次,不断强制结束线程池
for (int i = 0; i < 1000; i++) {
// 立即关闭,包括原有任务也打断
es.shutdownNow();
// 等待原有任务被打断完成
if (es.awaitTermination(10, TimeUnit.MILLISECONDS)) {
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public abstract class AbstractConfig implements Serializable {
legacyProperties.put("dubbo.service.url", "dubbo.service.address");
}

static { // TODO 芋艿,注意
static {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
if (logger.isInfoEnabled()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,8 @@ protected List<URL> loadRegistries(boolean provider) {
url = url.addParameter(Constants.REGISTRY_KEY, url.getProtocol());
url = url.setProtocol(Constants.REGISTRY_PROTOCOL);
// 添加到结果
if ((provider && url.getParameter(Constants.REGISTER_KEY, true)) // 服务提供者 && 注册
|| (!provider && url.getParameter(Constants.SUBSCRIBE_KEY, true))) { // 服务消费者 && 订阅
if ((provider && url.getParameter(Constants.REGISTER_KEY, true)) // 服务提供者 && 注册 https://dubbo.gitbooks.io/dubbo-user-book/demos/subscribe-only.html
|| (!provider && url.getParameter(Constants.SUBSCRIBE_KEY, true))) { // 服务消费者 && 订阅 https://dubbo.gitbooks.io/dubbo-user-book/demos/registry-only.html
registryList.add(url);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public class ApplicationConfig extends AbstractConfig {
private String compiler; // TODO 芋艿

// logger
private String logger; // TODO 芋艿
private String logger;

// registry centers
private List<RegistryConfig> registries;
Expand Down Expand Up @@ -203,6 +203,7 @@ public String getLogger() {

public void setLogger(String logger) {
this.logger = logger;
// 设置 LoggerAdapter
LoggerFactory.setLoggerAdapter(logger);
}

Expand Down
Loading

0 comments on commit 6cd742f

Please sign in to comment.