簡體   English   中英

slf4j如何將sfl4j-api中的org.slf4j.impl.StaticLoggerBinder替換為真正的StaticLoggerBinder

[英]How slf4j replace org.slf4j.impl.StaticLoggerBinder placed in sfl4j-api to real StaticLoggerBinder

在slf4j api中存在類org.slf4j.impl.StaticLoggerBinder,org.slf4j.impl.StaticMarkerBinder,org.slf4j.impl.StaticMDCBinder。 但是每個綁定到具體記錄器的應該包含相同的類。

例如:

http://grepcode.com/file/repo1.maven.org/maven2/org.slf4j/slf4j-api/1.6.1/org/slf4j/impl/StaticLoggerBinder.java?av=f

及其log4j實現: http ://grepcode.com/file/repo1.maven.org/maven2/org.slf4j/slf4j-log4j12/1.6.1/org/slf4j/impl/StaticLoggerBinder.java?av = f

java類加載器如何替代它? 這不應該是一個例外嗎?

如果您提取實際的slf4j-api jar,您會注意到org.slf4j.impl.StaticLoggerBinder實際上並未包含在jar中。 SFL4J api是在構建時針對類編譯的,但它實際上並未包含在工件中。 如果查看api模塊中org.slf4j.impl.StaticLoggerBinder的源代碼,它沒有實現,所有公共實例方法都會拋出UnsupportedOperationException 這沒關系,因為該類被排除在slf4j-api jar之外。

類加載器正常運行並選擇在需要加載類時找到的org.slf4j.impl.StaticLoggerBinder的第一個版本。 這通常來自它在類路徑中列出的第一個slf4j實現jar。

注意: findPossibleStaticLoggerBinderPathSet()僅用於警告類路徑上存在多個綁定。 它實際上並不加載任何綁定。

嗯,好問題,因為slf4j假設不使用運行時加載類。 它看起來在啟動時使用classloader檢查以下方法:

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

@Dev是對的 - org.slf4j.impl.StaticLoggerBinder僅包含在slf4j-api源中而不包含在二進制文件中 - 由於編譯原因,僅包含在源代碼中是一個簡單的技巧。 可以理解的是, findPossibleStaticLoggerBinderPathSet僅用於記錄目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM