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

时间:2011-05-20 11:02:30

标签: log4j

有没有办法弄清楚Log4J从哪里挑选配置文件? 我试图更改我的log4j.xml,并且更改没有反映在Log4j行为中。我删除了log4j.xml,有趣的是,Log4J仍在使用旧的行为。所以它必须选择我的命名空间中可用的一些配置文件。但问题是如何弄清楚哪一个。有没有办法做到这一点?在jar等上有很多不同的依赖项,因此其中一个必须包含一个覆盖我的更改的log4j.xml或log4j.properties。 有什么想法吗?

2 个答案:

答案 0 :(得分:7)

运行应用程序时,您可以设置系统属性-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,如here所述。

答案 1 :(得分:0)

FrVaBe中激活his answer建议的-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询问其当前使用的配置文件,请告诉我。