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>

Регистрирането в webapp работи добре. Въпреки това съм объркан от грешката.

Имам тези зависимости в проекта:

<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>

Имах същия проблем, когато Джети търсеше файла log4j.properties, използвайки програма за зареждане на класове, която не включваше изходния код на моя проект. ТАКА че продължи да се оплаква "log4j:WARN Не могат да бъдат намерени добавки за logger (org.eclipse.jetty.util.log).". Но това решение го реши и аз мога да видя съобщението в журнала и да ги контролирам чрез log4j.

person asaed    schedule 23.04.2013

Както е посочено в тази тема в таблото за съобщения, не можете да конфигурирате log4j с системни свойства в приставката на jetty-maven вече. От Jetty 7.5.0 класовете на Jetty вече използват статични инициализатори на журнали. Тези статични инициализатори на регистрационни файлове карат системата Log4j да бъде инициализирана преди системните свойства да бъдат заредени.

Две възможни заобиколни решения биха били или преминаване към Jetty 7.4.5, или използване на отделен плъгин maven, като например property-maven-plugin, за да зададете системните свойства на log4j, преди плъгинът Jetty да бъде инициализиран.

person piepera    schedule 30.05.2012
comment
Благодаря ти. Благодаря ти. Благодаря ти. От известно време се боря със системните свойства и плъгина 8.x Jetty. Прочетох толкова много публикации, но тази е първата, която работи. - 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