我如何知道Log4j从何处选择其配置

我如何知道Log4j从何处选择其配置,log4j,Log4j,有没有办法确定Log4J从哪里挑选配置文件? 我试图更改log4j.xml,但这些更改没有反映在log4j行为中。我删除了log4j.xml,有趣的是,log4j仍在使用旧的行为。因此,它必须选择一些在我的命名空间中可用的配置文件。但问题是我怎样才能知道是哪一个。有办法吗?JAR等上有很多不同的依赖项,因此其中一个必须包含覆盖我的更改的log4j.xml或log4j.properties。 有什么想法吗?运行应用程序时,可以设置系统属性-Dlog4j.debug。在这种情况下,log4j将生成调

有没有办法确定Log4J从哪里挑选配置文件? 我试图更改log4j.xml,但这些更改没有反映在log4j行为中。我删除了log4j.xml,有趣的是,log4j仍在使用旧的行为。因此,它必须选择一些在我的命名空间中可用的配置文件。但问题是我怎样才能知道是哪一个。有办法吗?JAR等上有很多不同的依赖项,因此其中一个必须包含覆盖我的更改的log4j.xml或log4j.properties。
有什么想法吗?

运行应用程序时,可以设置系统属性
-Dlog4j.debug
。在这种情况下,log4j将生成调试输出,并告诉您如何解析到log4j.xml的路径,例如:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@11b86e7.
log4j: Using URL [file:/C:/develop/workspace/foobar/target/classes/log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator

要设置显式路径,请使用系统属性
-Dlog4j.configuration=file:c:/pathToFile
,如前所述。

激活
-Dlog4j.debug
是一个很好的解决方案。但是,我希望在启动时打印或记录位置,而不激活log4j的调试模式。我创建了一个小的util方法,它主要是log4j的默认init例程的副本,该例程返回配置文件的URL

也许它对其他人有用:

/**
 * Get the URL of the log4j config file. This is mostly copied from org.apache.log4j.LogManager's default init routine.
 *
 * @return log4j config url
 */
public static URL getLog4JConfigurationUrl(){

    /** Search for the properties file log4j.properties in the CLASSPATH.  */
    String override = OptionConverter.getSystemProperty(LogManager.DEFAULT_INIT_OVERRIDE_KEY, null);

    // if there is no default init override, then get the resource
    // specified by the user or the default config file.
    if (override == null || "false".equalsIgnoreCase(override)){

      String configurationOptionStr = OptionConverter.getSystemProperty(LogManager.DEFAULT_CONFIGURATION_KEY, null);

      URL url;

      // if the user has not specified the log4j.configuration
      // property, we search first for the file "log4j.xml" and then
      // "log4j.properties"
      if (configurationOptionStr == null){
        url = Loader.getResource("log4j.xml");
        if (url == null){
          url = Loader.getResource(LogManager.DEFAULT_CONFIGURATION_FILE);
        }
      } else {
        try {
          url = new URL(configurationOptionStr);
        } catch (MalformedURLException ex) {
          // so, resource is not a URL:
          // attempt to get the resource from the class path
          url = Loader.getResource(configurationOptionStr);
        }
      }

      if (url == null)
        throw new RuntimeException("log4j configuration could not be found!");

      return url;
    }

    throw new RuntimeException("default init is overridden, log4j configuration could not be found!");
  }
PS:如果您知道如何向log4j询问当前使用的配置文件,请告诉我