Java 为什么Log4J2在文件名中查找带有类加载器字符串的配置文件?

Java 为什么Log4J2在文件名中查找带有类加载器字符串的配置文件?,java,classloader,embedded-resource,log4j2,Java,Classloader,Embedded Resource,Log4j2,我正在尝试设置Log4J2,并将其StatusLogger打印到控制台,以便理解为什么它没有看到我的配置文件(出于好奇,我认为问题在于Log4J2使用的JSON库不在我的类路径中,所以它以静默方式失败,但不幸的是,我不确定) 然而,一旦我将StatusLogger设置为打印TRACE语句,我注意到一些奇怪的事情-它似乎在寻找文件名中调用sun.misc.Launcher$AppClassLoader.toString()的资源,例如(为了可读性增加了新行): 它要查找的文件本质上是“log4j2

我正在尝试设置Log4J2,并将其
StatusLogger
打印到控制台,以便理解为什么它没有看到我的配置文件(出于好奇,我认为问题在于Log4J2使用的JSON库不在我的类路径中,所以它以静默方式失败,但不幸的是,我不确定)

然而,一旦我将
StatusLogger
设置为打印
TRACE
语句,我注意到一些奇怪的事情-它似乎在寻找文件名中调用
sun.misc.Launcher$AppClassLoader.toString()
的资源,例如(为了可读性增加了新行):

它要查找的文件本质上是
“log4j2”+classLoader+“.json”
,这让我觉得很奇怪。但是通过配置加载行为进行调试,我们可以看到这源于执行以下操作的
ClassLoaderContextSelector.locateContext()

private LoggerContext locateContext(final ClassLoader loader, 
    final URI configLocation {
  final String name = loader.toString();
  ...
  LoggerContext ctx = new LoggerContext(name, null, configLocation);
  ...
}
这最终导致调用
ctx.start()
,最终调用
Loader.getResource()
Loader.toString()的值作为
resource
字符串的一部分传入。从这个角度看,这种行为似乎相当有意图,但我无法想象为什么寻找这样一个资源名称会有好处。这给我们带来了什么?这是虫子吗


SSCCE:

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.status.StatusConsoleListener;
import org.apache.logging.log4j.status.StatusLogger;

public class L4JTrace {    
  public static void main(String[] args) {
    StatusConsoleListener listener = new StatusConsoleListener(Level.ALL);
    StatusLogger.getLogger().registerListener(listener);
    LogManager.getLogger(MyApp.class.getName());
  }
}
这应该输出如下内容:

2013-12-09 01:22:27,132 WARN Multiple logging implementations found: 
Factory: org.apache.logging.log4j.core.impl.Log4jContextFactory, Weighting: 10
Using factory: org.apache.logging.log4j.core.impl.Log4jContextFactory
2013-12-09 01:22:27,148 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,160 DEBUG Found Plugin Map at jar:file:LOCALPATH
2013-12-09 01:22:27,162 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,202 WARN JmDNS or serviceInfo class not found java.lang.ClassNotFoundException: javax.jmdns.JmDNS # Exception truncated
2013-12-09 01:22:27,221 DEBUG Generated plugins in 0.062408180 seconds
2013-12-09 01:22:27,240 DEBUG Jansi is not installed, cannot find org.fusesource.jansi.WindowsAnsiOutputStream
2013-12-09 01:22:27,241 DEBUG Starting OutputStreamManager SYSTEM_OUT
2013-12-09 01:22:27,242 DEBUG Reconfiguration started for context sun.misc.Launcher$AppClassLoader@765291
2013-12-09 01:22:27,242 DEBUG Generated plugins in 0.000013583 seconds
2013-12-09 01:22:27,245 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,245 DEBUG Missing dependencies for Json support
2013-12-09 01:22:27,245 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,245 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,254 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,254 DEBUG Generated plugins in 0.000012075 seconds
2013-12-09 01:22:27,254 DEBUG Jansi is not installed, cannot find org.fusesource.jansi.WindowsAnsiOutputStream
2013-12-09 01:22:27,261 DEBUG Generated plugins in 0.000015998 seconds
2013-12-09 01:22:27,261 DEBUG Reconfiguration completed
2013-12-09 01:22:27,263 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,264 DEBUG Shutting down OutputStreamManager SYSTEM_OUT

我认为这可能与web应用程序有关;多个web应用程序可以同时共存,并且需要有一个单独的LoggerContext。ClassLoader对象toString保证LoggerContext的名称是唯一的

如果您在log4j开发人员邮件列表中询问,log4j团队成员可能会对此有更多的了解

2013-12-09 01:22:27,132 WARN Multiple logging implementations found: 
Factory: org.apache.logging.log4j.core.impl.Log4jContextFactory, Weighting: 10
Using factory: org.apache.logging.log4j.core.impl.Log4jContextFactory
2013-12-09 01:22:27,148 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,160 DEBUG Found Plugin Map at jar:file:LOCALPATH
2013-12-09 01:22:27,162 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,202 WARN JmDNS or serviceInfo class not found java.lang.ClassNotFoundException: javax.jmdns.JmDNS # Exception truncated
2013-12-09 01:22:27,221 DEBUG Generated plugins in 0.062408180 seconds
2013-12-09 01:22:27,240 DEBUG Jansi is not installed, cannot find org.fusesource.jansi.WindowsAnsiOutputStream
2013-12-09 01:22:27,241 DEBUG Starting OutputStreamManager SYSTEM_OUT
2013-12-09 01:22:27,242 DEBUG Reconfiguration started for context sun.misc.Launcher$AppClassLoader@765291
2013-12-09 01:22:27,242 DEBUG Generated plugins in 0.000013583 seconds
2013-12-09 01:22:27,245 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,245 DEBUG Missing dependencies for Json support
2013-12-09 01:22:27,245 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,245 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,246 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,247 TRACE Trying to find [log4j2-testsun.misc.Launcher$AppClassLoader@765291.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,248 TRACE Trying to find [log4j2-test.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,249 TRACE Trying to find [log4j2-test.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,250 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,251 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2sun.misc.Launcher$AppClassLoader@765291.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.json] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.jsn] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,252 TRACE Trying to find [log4j2.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.jsn] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.jsn] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using context classloader sun.misc.Launcher$AppClassLoader@765291.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using sun.misc.Launcher$AppClassLoader@765291 class loader.
2013-12-09 01:22:27,253 TRACE Trying to find [log4j2.xml] using ClassLoader.getSystemResource().
2013-12-09 01:22:27,254 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,254 DEBUG Generated plugins in 0.000012075 seconds
2013-12-09 01:22:27,254 DEBUG Jansi is not installed, cannot find org.fusesource.jansi.WindowsAnsiOutputStream
2013-12-09 01:22:27,261 DEBUG Generated plugins in 0.000015998 seconds
2013-12-09 01:22:27,261 DEBUG Reconfiguration completed
2013-12-09 01:22:27,263 DEBUG ServletContext not present - WebLookup not added
2013-12-09 01:22:27,264 DEBUG Shutting down OutputStreamManager SYSTEM_OUT