排查log4j:WARN No appenders could be found for logger (org.apache.dubbo.common.logger.LoggerFactory)

日誌信息

有關啓動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門面,所以沒有此問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章