Как я могу узнать, откуда Log4j выбирает свою конфигурацию?

Есть ли способ выяснить, откуда Log4J выбирает файл конфигурации? Я попытался изменить свой log4j.xml, но изменения не отразились на поведении Log4j. Я удалил log4j.xml и, как ни странно, Log4J все еще работает со старым поведением. Поэтому он должен выбирать какой-то файл конфигурации, доступный в моем пространстве имен. Но вопрос в том, как я могу понять, какой именно. Есть ли способ сделать это? существует так много разных зависимостей от банок и т. д., поэтому одна из них должна содержать log4j.xml или log4j.properties, которые переопределяют мои изменения. Есть идеи?


person Charbel    schedule 20.05.2011    source источник


Ответы (2)


При запуске вашего приложения вы можете установить системное свойство -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, как описано здесь.

person FrVaBe    schedule 20.05.2011

Активация -Dlog4j.debug, как предложено FrVaBe в его ответ - хорошее решение. Однако я хотел распечатать или зарегистрировать местоположение при запуске, не активируя режим отладки log4j. Я создал небольшой служебный метод, который в основном является копией стандартной процедуры инициализации log4j, которая возвращает 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 используемый в настоящее время файл конфигурации, дайте мне знать.

person Tim Büthe    schedule 23.08.2013