Как я могу предоставить собственный log4j.xml для различных задач муравья? - PullRequest
5 голосов
/ 27 января 2009

У меня есть файл сборки, который как часть процесса сборки опирается на несколько taskdef. Эти элементы taskdef (например, webdoclet и jasper2) используют log4j в качестве регистратора. В идеале я хотел бы иметь возможность предоставить отдельный файл конфигурации log4j для каждого, но как минимум, я бы хотел указать, какой файл конфигурации log4j используется.

То, что я делал, когда-то работал, - это поместил в начало пути к классам каталог, содержащий log4j.xml, который я хотел использовать в taskdef. Например:

<target name="define.jasper2">
  <path id="jspc.classpath">
      <!-- Put this FIRST so Jasper will find the log4j.xml in the Build directory -->
      <pathelement location="Build"/>
      <fileset dir="${tomcat.libs}">
             ....
      </fileset>
      <pathelement location="${log4j.jar}"/>
      ....
  </path>

  <taskdef name="jasper2" classname="org.apache.jasper.JspC" classpathref="jspc.classpath"/>
</target>

Я убедился, что на самом деле каталог "Build" находится в начале пути к классам, и что в этом каталоге существует файл log4j.xml. Однако, когда я запускаю ant в подробном режиме с log4j в режиме отладки, я вижу, что log4j выбирает log4j.xml, который находится в текущем рабочем каталоге , а не тот, который мне нужен. Похоже, что Log4j не использует classpath для разрешения файла по умолчанию log4j.xml.

Я использую log4j 1.2.8 (встроенный в более крупный фреймворк, поэтому я не могу его обновить), и некоторые из этих задач, по-видимому, полагаются на commons-logging 1.0.3. В процессе сборки используется Sun Java 5.

Если я set ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml перед запуском ant, то taskdefs правильно загрузит нужный log4j.xml.

Помещение каталога "Build" в начало пути к классам для используемых Taskdef. Я не знаю, что изменилось. Как я могу восстановить поведение, где я могу контролировать - в build.xml - какой файл конфигурации log4j используется для данной задачи? Есть ли другой способ, кроме установки ANT_OPTS и других файлов, кроме перестановки, для перемещения файла log4j.xml приложения из текущего рабочего каталога, чтобы log4j нашел правильный файл log4j.xml?

Ответы [ 4 ]

3 голосов
/ 11 августа 2009

Я могу указать файл конфигурации, используя относительный URL-адрес файла с sysproperty, например:

<java classname="com.lunatech.MainClass">
   <sysproperty key="log4j.configuration" value="file:src/log4j-debug.properties"/>
   <classpath refid="runtime.classpath"/>
</java>
2 голосов
/ 27 января 2009

Log4j загружает свою конфигурацию, ища системное свойство log4j.configuration. В противном случае он ищет log4j.properties или log4j.xml в пути к классам.

В некоторых задачах ant, которые разветвляют новую JVM, вы можете указать системное свойство log4j.configuration с тегом . Тем не менее, для тех, кто не лучшим выбором, является создание записи classpath, первой записью которой является конфигурация log4j, которую вы хотели бы использовать.

0 голосов
/ 31 января 2009

Если я установлю ANT_OPTS = -Dlog4j.configuration = Build / log4j.xml перед запуском ant, то taskdefs правильно загрузит нужный log4j.xml.

Вы пытались установить это свойство с помощью sysproperty?

Должно выглядеть примерно так:

<target name="define.jasper2">
   <sysproperty key="log4j.configuration" value="Build/log4j.xml"/>
   ...
</target>
0 голосов
/ 27 января 2009

Можете ли вы переместить файл log4j.xml, который находится в текущем рабочем каталоге?

...