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

标签 java classloader embedded-resource log4j2

我正在尝试设置 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/

相关文章:

java - hive 服务器未启动

tomcat/struts 启动为 java.io.File 抛出 ClassNotFoundException

java - ClassLoader 应该是线程安全的吗?

java - 如何在 Eclipse 上导出带有图像的 jar?

java - 如何在java中导出resources文件夹中的所有文件和文件夹

java - 如何修复变量可能尚未初始化

java - 返回我的图书馆系统时出现问题

java - Java 中的 C 指针等价

java - 在运行时更改应用程序的类?

c# - 存储 WPF 图像资源