我正在尝试设置 Log4J2 并将其 StatusLogger
打印到控制台,这样我就可以理解为什么它没有看到我的配置文件(出于好奇,我认为问题是Log4J2 使用的 JSON 库不在我的类路径中,因此它默默地失败了,但不幸的是我不确定)。
但是,一旦我将 StatusLogger
设置为打印 TRACE
语句,我注意到一些奇怪的事情 - 它似乎正在使用 sun.misc.Launcher$ 寻找资源AppClassLoader.toString()
在文件名中调用,例如(为了可读性添加了换行符):
2013-12-09 01:07:23,938 TRACE Trying to find
[log4j2sun.misc.Launcher$AppClassLoader@765291.json]
using context classloader sun.misc.Launcher$AppClassLoader@765291.
它正在寻找的文件本质上是“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应用程序可以同时共存,并且需要有一个单独的LoggerContext。 ClassLoader 对象 toString 保证 LoggerContext 的名称唯一。
如果您在 log4j Dev 邮件列表上询问,log4j 团队成员也许能够对此提供更多信息。
关于java - 为什么 Log4J2 查找文件名中带有类加载器字符串的配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20464503/