SLF4J/Log4J не инициализирован в плагине jetty-maven

Я получаю эту ошибку при запуске плагина jetty-maven:

[INFO] --- jetty-maven-plugin:7.6.1.v20120215:start (start-jetty) @ rest ---
log4j:WARN No appenders could be found for logger (org.eclipse.jetty.util.log).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

Проект представляет собой войну, которая содержит log4j.properties в WEB-INF/classes.

Я также передаю плагину следующие свойства, просто чтобы посмотреть, что происходит (этот конкретный файл log4j.properties также существует в расположении ниже):

<!-- Log4J settings -->
<systemProperty>
    <name>log4j.configuration</name>
    <value>file://${project.build.testOutputDirectory}/log4j.properties</value>
</systemProperty>
<systemProperty>
    <name>log4j.debug</name>
</systemProperty>

Регистрация в веб-приложении работает нормально. Тем не менее, я сбит с толку ошибкой.

У меня есть эти зависимости в проекте:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-core</artifactId>
</dependency>

Кроме того, когда тесты (для которых требуется Jetty) начинают выполняться, я вижу следующий вывод:

log4j: Using URL [file:/project/foo/rest/target/test-classes/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/project/foo/rest/target/test-classes/log4j.properties
log4j: Parsing for [root] with value=[ERROR, console].
log4j: Level token is [ERROR].
log4j: Category root set to ERROR
log4j: Parsing appender named "console".
log4j: Parsing layout options for "console".
log4j: Setting property [conversionPattern] to [%d %p %c - %m%n].
log4j: End of parsing for "console".
log4j: Parsed "console" options.
log4j: Parsing for [project.foo] with value=[DEBUG].
log4j: Level token is [DEBUG].
log4j: Category project.foo set to DEBUG
log4j: Handling log4j.additivity.project.foo=[null]
log4j: Finished configuring.

Может ли кто-нибудь сказать мне, почему Джетти недоволен?


person carlspring    schedule 03.04.2012    source источник


Ответы (3)


Другой альтернативой является использование URL-адреса в стиле «file:///» для log4j.properties следующим образом:

 <plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>8.1.10.v20130312</version>
  <configuration>
    <systemProperties>
            <systemProperty>
                <name>log4j.configuration</name>
                <!-- have to use file:/// url since -->
                    <!-- Jetty is using classloader --> 
                    <!-- before the webapp classloader is ready -->
               <value>file:///${basedir}/src/main/resources/log4j.properties</value>
            </systemProperty>
     <configuration>
     <dependencies>
        <dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-log4j12</artifactId>  
            <version>1.6.6</version>  
        </dependency>
     </dependencies>
 </plugin>

У меня была та же проблема, когда Jetty искал файл log4j.properties с помощью загрузчика классов, который не включал исходный код моего проекта. ТАК он продолжал жаловаться «log4j: WARN Не удалось найти приложения для регистратора (org.eclipse.jetty.util.log)». Но этот обходной путь решил проблему, и я могу видеть сообщение журнала и управлять им через log4j.

person asaed    schedule 23.04.2013

Как указано в этой ветке форума, вы не можете настроить log4j с помощью системных свойств в плагине jetty-maven-plugin больше нет. Начиная с Jetty 7.5.0, классы Jetty теперь используют инициализаторы статического журнала. Эти статические инициализаторы журнала вызывают инициализацию системы Log4j до загрузки системных свойств.

Двумя возможными обходными путями могут быть либо переход на Jetty 7.4.5, либо использование отдельного подключаемого модуля maven, такого как properties-maven-plugin, для установки системных свойств log4j до инициализации подключаемого модуля Jetty.

person piepera    schedule 30.05.2012
comment
Спасибо. Спасибо. Спасибо. Я некоторое время боролся со свойствами системы и плагином Jetty 8.x. Я прочитал так много сообщений, но это первое, что сработало. - person ksclarke; 24.11.2012

Проблема заключалась в том, что у меня есть агрегатор с несколькими модулями, каждый из которых запускает Jetty перед его тестами, а затем останавливает его. При запуске Jetty я определил <systemProperties/>. Изучив исходники Jetty, я обнаружил, что после того, как системные свойства установлены таким образом в одном из модулей, они никогда не переопределяются позже (в других ваших модулях) просто потому, что в плагине есть правило, которое запрещает это. Таким образом, системные свойства для ведения журнала путались между исполнениями, несмотря на то, что они находились в разных подмодулях.

Я исправил это, написав свой собственный плагин Maven, который устанавливает для вас системные свойства перед выполнением. Я разместил проект здесь в github. Объяснения того, как его использовать, можно найти здесь.

person carlspring    schedule 06.04.2012
comment
Спасибо за это решение; ваш плагин не работал у меня, но я смог использовать цель set-system-properties плагина свойств maven (mojo.codehaus.org/properties-maven-plugin), чтобы выполнить то же самое. - person piepera; 18.05.2012
comment
На самом деле я отправил сообщение об ошибке ребятам из Jetty здесь: jira.codehaus.org/browse/ ПРИЧАЛ-1507. По сути, плагин не будет переопределять уже существующие системные свойства. Я должен был найти это трудным путем. Это действительно не ожидаемое поведение. Если хотите, можете проголосовать за билет. - person carlspring; 18.05.2012