slf4j查看

###slf4j查看

  1. 先从LoggerFactory这个类入手,起始于getLogger方法

    public static Logger getLogger(String name) {
    	ILoggerFactory iLoggerFactory = getILoggerFactory();
    	return iLoggerFactory.getLogger(name);
    }
    

getILoggerFactory调用后找寻的是类路中StaticLoggerBinder的实现类。

	private final static void bind() {
	    try {
	      Set staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();
	      reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);
	      // the next line does the binding
	      StaticLoggerBinder.getSingleton();
	      INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;
	      reportActualBinding(staticLoggerBinderPathSet);
	      emitSubstituteLoggerWarning();
	    } catch (NoClassDefFoundError ncde) {
	      String msg = ncde.getMessage();
	      if (messageContainsOrgSlf4jImplStaticLoggerBinder(msg)) {
	        INITIALIZATION_STATE = NOP_FALLBACK_INITIALIZATION;
	        Util.report("Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".");
	        Util.report("Defaulting to no-operation (NOP) logger implementation");
	        Util.report("See " + NO_STATICLOGGERBINDER_URL
	                + " for further details.");
	      } else {
	        failedBinding(ncde);
	        throw ncde;
	      }
	    } catch (java.lang.NoSuchMethodError nsme) {
	      String msg = nsme.getMessage();
	      if (msg != null && msg.indexOf("org.slf4j.impl.StaticLoggerBinder.getSingleton()") != -1) {
	        INITIALIZATION_STATE = FAILED_INITIALIZATION;
	        Util.report("slf4j-api 1.6.x (or later) is incompatible with this binding.");
	        Util.report("Your binding is version 1.5.5 or earlier.");
	        Util.report("Upgrade your binding to version 1.6.x.");
	      }
	      throw nsme;
	    } catch (Exception e) {
	      failedBinding(e);
	      throw new IllegalStateException("Unexpected initialization failure", e);
	    }
	  }

进入到findPossibleStaticLoggerBinderPathSet方法:

	private static Set findPossibleStaticLoggerBinderPathSet() {
	    // use Set instead of list in order to deal with  bug #138
	    // LinkedHashSet appropriate here because it preserves insertion order during iteration
	    Set staticLoggerBinderPathSet = new LinkedHashSet();
	    try {
	      ClassLoader loggerFactoryClassLoader = LoggerFactory.class
	              .getClassLoader();
	      Enumeration paths;
	      if (loggerFactoryClassLoader == null) {
	        paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
	      } else {
	        paths = loggerFactoryClassLoader
	                .getResources(STATIC_LOGGER_BINDER_PATH);
	      }
	      while (paths.hasMoreElements()) {
	        URL path = (URL) paths.nextElement();
	        staticLoggerBinderPathSet.add(path);
	      }
	    } catch (IOException ioe) {
	      Util.report("Error getting resources from path", ioe);
	    }
	    return staticLoggerBinderPathSet;
	  }

通过classLoader加载的类是org/slf4j/impl/StaticLoggerBinder.class是否在类路径存在。如果有多个会或者0个会提示报错信息。

最后间接使用的loggerFactory是Log4jLoggerFactory

private StaticLoggerBinder() {
    loggerFactory = new Log4jLoggerFactory();
    try {
        @SuppressWarnings("unused")
        Level level = Level.TRACE;
    } catch (NoSuchFieldError nsfe) {
        Util.report("This version of SLF4J requires log4j version 1.2.12 or later. See also http://www.slf4j.org/codes.html#log4j_version");
    }
}

通过getLogger方法得到是log4j jar包里面的org.apache.log4j.Logger log4jLogger

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;
    }
}

ConcurrentMap会多一个方法putIfAbsent相对于普通map。不存在的时候插入,存在的时候不改变。--相对也是线程安全的。

logger返回时候 还是要包装一下成org.slf4j.Logger接口,方便通用。

public void debug(String format, Object arg) {
    if (logger.isDebugEnabled()) {
        FormattingTuple ft = MessageFormatter.format(format, arg);
        logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
    }
}

举出其中一个的例子,logger.isDebugEnabled代替了以前代码里面很繁琐的判断过程。使用装饰器对log4j的logger进行了加强。还支持message占位符支持。也算是一个不错的优点了。

转载于:https://my.oschina.net/zooy/blog/515083

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值