日誌信息
有關啓動dubbo服務,報出如下錯誤:
log4j:WARN No appenders could be found for logger (org.apache.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
用過log4j的同學應該能看出來,就是少個log4j.properties配置文件,不知道dubbo爲什麼默認使用的是log4j,咱還是看下源碼,在依賴包中找到目標類:
public class LoggerFactory {
// search common-used logging frameworks
static {
String logger = System.getProperty("dubbo.application.logger", "");
switch (logger) {
case "slf4j":
setLoggerAdapter(new Slf4jLoggerAdapter());
break;
case "jcl":
setLoggerAdapter(new JclLoggerAdapter());
break;
case "log4j":
setLoggerAdapter(new Log4jLoggerAdapter());
break;
case "jdk":
setLoggerAdapter(new JdkLoggerAdapter());
break;
case "log4j2":
setLoggerAdapter(new Log4j2LoggerAdapter());
break;
default:
List<Class<? extends LoggerAdapter>> candidates = Arrays.asList(
Log4jLoggerAdapter.class,
Slf4jLoggerAdapter.class,
Log4j2LoggerAdapter.class,
JclLoggerAdapter.class,
JdkLoggerAdapter.class
);
for (Class<? extends LoggerAdapter> clazz : candidates) {
try {
setLoggerAdapter(clazz.newInstance());
break;
} catch (Throwable ignored) {
}
}
}
}
小編用的是dubbo2.7.7,顯然這是一個靜態代碼塊,一啓動及開始加載,首先找系統屬性 dubbo.application.logger ,沒有就開始加載LoggerAdapter適配器,顯然Log4jLoggerAdapter排到了第一位,就用log4j了。
解決辦法:
1 使用log4j,添加log4j.properties配置文件
2 啓動類添加 System.setProperty(“dubbo.application.logger”,“log4j2”) 指定項目中使用的日誌框架
3 設置jvm啓動參數 -Ddubbo.application.logger=log4j2
關於dubbox:
用過dubbox的童鞋應該沒出現過此類問題,這是因爲源碼已修改,這也是可以採取的解決方案,下載dubbo源碼,然後自己修改源代碼,重新打包jar。看下dubbox中此類的實現方式:
// 查找常用的日誌框架
static {
String logger = System.getProperty("dubbo.application.logger");
if ("slf4j".equals(logger)) {
setLoggerAdapter(new Slf4jLoggerAdapter());
} else if ("jcl".equals(logger)) {
setLoggerAdapter(new JclLoggerAdapter());
} else if ("log4j".equals(logger)) {
setLoggerAdapter(new Log4jLoggerAdapter());
} else if ("jdk".equals(logger)) {
setLoggerAdapter(new JdkLoggerAdapter());
} else {
try {
setLoggerAdapter(new Log4jLoggerAdapter());
} catch (Throwable e1) {
try {
setLoggerAdapter(new Slf4jLoggerAdapter());
} catch (Throwable e2) {
try {
setLoggerAdapter(new JclLoggerAdapter());
} catch (Throwable e3) {
setLoggerAdapter(new JdkLoggerAdapter());
}
}
}
}
}
dubbox中如果出現異常還是會再使用Slf4jLoggerAdapter適配一次,大多項目都是採用slf4j門面,所以沒有此問題。