Несколько файлов Log4j.properties в пути к классам

Как Log4j управляет несколькими log4j.properties в своем пути к классам? Какой файл log4j.properties имеет приоритет? Позвольте мне описать точный сценарий.

У меня есть несколько модулей maven, разработанных разными командами, и каждый из них имеет свой файл log4j.properties. Все эти файлы log4j.properties имеют RootLogger, настроенные вместе с ConsoleAppender и FileAppenders.

Теперь, когда Log4j загружает файл log4j.properties, он будет использоваться для настройки параметров RootLogger? Кроме того, как Log4j создаст иерархию Logger? Как файл log4j.properties в других сторонних банках влияет на процесс ведения журнала?

Ответ 1

Будет загружен первый файл в пути к классам. Поэтому, если у A.jar и B.jar есть файл, а A.jar - до B.jar в пути к классам, будет загружен файл A.jar. Это то, как работает загрузчик классов.

Ответ 2

log4j ver 1.x:

Как указывали другие, log4j ищет первый файл конфигурации в пути к классам. См.: http://logging.apache.org/log4j/1.2/manual.html.

Но когда есть файлы "log4j.xml" и "log4j.properties" в пути к классам, из экспериментов кажется, что log4j имеет приоритет "log4j.xml" над "log4j.properties".

Во-первых, log4j, похоже, выглядит в пути к первому файлу log4j.xml. Если их нет, тогда log4j, похоже, будет выглядеть в пути к первому файлу log4j.properties.

Копирование и вставка из приведенного ниже кода может помочь в определении того, какой файл конфигурации используется:

import org.apache.log4j.Logger;

public class TestLog4j
{

  static
  {
    System.out.println("Classpath: [" + System.getProperty( "java.class.path" ) + "]" );
    System.out.println("Found logging configuration files:");
    System.out.println("  log4j.xml: " + Logger.getRootLogger().getClass().getResource( "/log4j.xml" ) );
    System.out.println("  log4j.properties: " + Logger.getRootLogger().getClass().getResource( "/log4j.properties" ) );
  }

  public static void main(String[] args)
  {
    System.out.println("main():");
  }
}

Редактировать:

log4j ver 2.x:

Порядок поиска для файла конфигурации по умолчанию описан здесь: http://logging.apache.org/log4j/2.x/manual/configuration.html

т.е. для log4j версии 2.x, если файл конфигурации с более высоким приоритетом не найден (например, log4j2-test. [properties | yaml | json | xml]), тогда файл log4j2.properties используется, если он найден в пути к классам. Обратите внимание, что log4j2.xml имеет самый низкий приоритет и будет использоваться, только если файлы конфигурации log4j2 'properties', 'yaml' или 'json' не найдены.

Примечание. Чтобы помочь в отладке проблем с конфигурацией log4j, установите свойство "log4j.debug", например:

java -Dlog4j.debug ... 

См. Также: Как правильно инициализировать log4j?