Указание файла конфигурации (log4j2.xml) для log4j в качестве аргумента VM, работающего только в eclipse - PullRequest
0 голосов
/ 04 ноября 2018

Я использую новый Log4j2 - Java Logging Framework. Если в качестве аргумента VM -Dlog4j.configurationFile=/home/../config.xml я указываю путь к файлу конфигурации в eclipse, все работает нормально. Файл конфигурации загружен, и ведение журнала работает как положено, то есть все журналы записываются в файлы. Если я дополнительно использую -Dlog4j.debug, я получаю соответствующие отладочные сообщения от платформы, которая подтверждает правильную загрузку моего файла конфигурации.

Однако, когда я использую ANT с файлом build.xml, структура ведения журнала, похоже, инициализируется с конфигурацией по умолчанию - журналы больше не записываются в файлы, а в консоль. Я запускаю созданный файл prog.jar со следующей инструкции из консоли:

java -Dlog4j.configurationFile=/home/../config.xml -Dlog4j.debug -jar prog.jar

Единственное отладочное сообщение, которое я получаю от платформы Log4j2, является следующим:

DEBUG StatusLogger org.slf4j.helpers.Log4jLoggerFactory не находится на пути к классам. Хорошо!

В следующих частях файла build.xml, который я использую для создания prog.jar:

  <target name="init">
    <tstamp/>
    <mkdir dir="${build}"/>
  </target>

 <path id="master-classpath">
    <fileset dir="${lib}/apache-log4j-2.11.1-bin/">
        <include name="log4j-api-2.11.1.jar"/>
        <include name="log4j-core-2.11.1.jar"/>
    </fileset>
 </path>

  <target name="compile" depends="init" description="compile the source">
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}" includeantruntime="true">
        <classpath refid="master-classpath"/>
    </javac>
  </target>

  <target name="jar" depends="compile" description="generate the distribution">
    <mkdir dir="${dist}"/>
    <jar jarfile="${dist}/prog.jar" basedir="${build}" compress="true">
      <fileset dir="${src}" includes="**/*.java"/>
      <zipgroupfileset dir="${lib}/apache-log4j-2.11.1-bin/" includes="*.jar" />
      <manifest>
        <attribute name="Main-Class" value="ch.zwas.aks.Runner"/>
      </manifest>
    </jar>
  </target>

Я запутался, почему он работает с использованием Eclipse, но, очевидно, не работает, когда я создаю проект с помощью ANT и указываю файл конфигурации в консоли. Кроме того, я понятия не имею, почему больше нет сообщений отладки, когда я запускаю jar из консоли.

Спасибо за вашу поддержку.

1 Ответ

0 голосов
/ 05 ноября 2018

Благодаря подсказке Викаса Сачдева я смог решить проблему. Проблема заключалась в том, что я, очевидно, упаковал слишком много jar-файлов из библиотеки log4j в prog.jar. Когда я включаю только следующие jar-файлы, это работает, как и ожидалось, с ANT / console.

junit-X.jar
log4j-api-X.ja
log4j-core-X.jar
slf4j-api-X.jar
slf4j-simple-X.jar

Другие jar-файлы, поставляемые с библиотекой log4j, которые я пропустил. Кажется, что Eclipse игнорирует их, но когда они включены в build.xml, чтобы окончательно создать jar, они вызывают проблемы.

...