SLF4J / Log4J не инициализируется в jetty-maven-plugin - PullRequest
4 голосов
/ 03 апреля 2012

Я получаю эту ошибку при запуске plugin 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.

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

Ответы [ 3 ]

5 голосов
/ 24 апреля 2013

Другой альтернативой является использование 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.

4 голосов
/ 31 мая 2012

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

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

1 голос
/ 06 апреля 2012

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

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

...