日誌框架淺析(二)

SLF4J&&Log4j

簡介

依賴jar包:slf4j-api-x.x.x.jar,log4j.jar,slf4j-log4j12.jarapache

解析

log4j並無實現slf4j相應的接口,因此加了一層橋接層(slf4j-log4j12.jar包裏面的內容)來實現slf4jlog4j的調用
slf4j-log4j12.jar裏面的代碼很簡單
clipboard.png
只有5個類,關鍵的兩個類是Log4jLoggerFactoryLog4jLoggerAdapter,對應Log4jLoggerFactorygetLogger方法源碼:api

public Logger getLogger(String name) {
        Logger slf4jLogger = loggerMap.get(name);
        if (slf4jLogger != null) {
            return slf4jLogger;
        } else {
            org.apache.log4j.Logger log4jLogger;
            if(name.equalsIgnoreCase(Logger.ROOT_LOGGER_NAME))
                log4jLogger = LogManager.getRootLogger();
            else
                log4jLogger = LogManager.getLogger(name);
            Logger newInstance = new Log4jLoggerAdapter(log4jLogger);
            Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
            return oldInstance == null ? newInstance : oldInstance;
       }
    }
  1. Log4jLoggerFactory實現了slf4jILoggerFactory接口,調用getLogger方法獲取Loggerspa

  2. Log4jLoggerAdapter實現了slf4jLogger接口,而且實際代理了org.apache.log4j.Logger類,因此對Log4jLoggerAdapter的全部方法調用,最終調用的都是org.apache.log4j.Logger對應的方法代理

小結

log4j是經過slf4j-log4j12.jar橋接包來完美適配slf4j使用code

相關文章
相關標籤/搜索