2010-12-09 22 views
30

Ich habe eine Webanwendung, die die Log4jConfigurer-Klasse von Spring verwendet, um meine Log4J-Protokollfactory zu initialisieren. Im Grunde initialisiert es Log4J mit einer Konfigurationsdatei, die nicht im Klassenpfad ist. HierLog4J mit Feder initialisieren?

ist die config:

<bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="sbeHome"> 
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> 
    <property name="targetMethod" value="initLogging" /> 
    <property name="arguments"> 
     <list> 
      <value>#{ MyAppHome + '/conf/log4j.xml'}</value> 
     </list> 
    </property> 
</bean> 

Jedoch habe ich diesen Fehler beim Start der Anwendung erhalten:

log4j:WARN No appenders could be found for logger

und Tonnen von Spring-Anwendungskontext Initialisierungsmeldungen auf die Konsole ausgegeben werden. Ich denke, dies liegt daran, dass Spring meine Anwendung initialisiert, bevor es die Möglichkeit hat, meinen Logger zu initialisieren. Falls es darauf ankommt, verwende ich SLF4J zusätzlich zu Log4J.

Gibt es eine Möglichkeit, wie ich meinen Log4jConfigurer als erste Bean initialisieren kann? Oder gibt es einen anderen Weg, dies zu lösen?

Antwort

47

Sie könnten Ihre Log4j Zuhörer in der web.xml anstelle des feder context.xml

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/log4j.web.properties</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 

es bis So ist vor dem Frühling beginnt zu konfigurieren.

+0

Ich hätte erwähnen sollen, dass mein Pfad zur log4J-Eigenschaftendatei von einem JNDI-String kommt. Wie kann ich diesen JNDI-Wert an liefern. Wenn ich das tun könnte, denke ich, dass ich fertig bin. – HDave

+4

Ich habe dies gefunden: http://www.codeanch.com/t/362833/Servlets/java/log-ServletContextListener - es zeigt, wie Sie Ihre eigenen Log4j Konfiguration Listener implementieren, die einige Informationen von JNDI – Ralph

+0

Ich habe meine eigenen erstellt Servlet Context Listener wie sie es taten und alles funktioniert perfekt. Vielen Dank. – HDave

4

Anstatt log4j Konfiguration selbst im Code, warum nicht nur log4j an Ihrem (custom) Konfigurationsdatei Standort Punkt von

-Dlog4j.configuration=.../conf/log4j.xml 

auf Ihren Server Startup-Eigenschaften hinzufügen?

Noch besser, einfach log4j.xml an den Standardspeicherort - auf dem Klassenpfad - verschieben und log4j automatisch selbst konfigurieren lassen.

+4

Ich versuche, die log4j-Datei außerhalb der WAR-Datei zu halten, damit der Kunde sie problemlos für die Problemdiagnose anpassen kann. Was die JVM-Eigenschaft angeht, haben wir derzeit kein Startscript. Kunden stellen die WAR-Datei einfach bereit und gehen. – HDave

+0

In einigen Fällen sollten wir das Präfix "file" zum Pfad '-Dlog4j.configuration = file: conf/log4j.properties' hinzufügen. –

+0

@matt b Bitte klären Sie die Klassenpfad-Sequenz scannnng – gstackoverflow

8

Unsere Standalone-Anwendung erforderlich, um eine SMTPAppender, wo die E-Mail-Konfiguration bereits in einer Datei spring Config existiert, und wir wollen nicht, dass in der log4j.properties dupliziert werden.

Ich füge das Folgende zusammen, um einen zusätzlichen Appender mit Feder hinzuzufügen.

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject"> 
     <bean factory-method="getRootLogger" 
       class="org.apache.log4j.Logger" /> 
    </property> 
    <property name="targetMethod"> 
     <value>addAppender</value> 
    </property> 
    <property name="arguments"> 
     <list> 
      <bean init-method="activateOptions" 
        class="org.apache.log4j.net.SMTPAppender"> 
       <property name="SMTPHost" ref="mailServer" /> 
       <property name="from" ref="mailFrom" /> 
       <property name="to" ref="mailTo" /> 
       <property name="subject" ref="mailSubject" /> 
       <property value="10" name="bufferSize" /> 
       <property name="layout"> 
        <bean class="org.apache.log4j.PatternLayout"> 
         <constructor-arg> 
          <value>%d, [%5p] [%t] [%c] - %m%n</value> 
         </constructor-arg> 
        </bean> 
       </property> 
       <property name="threshold"> 
        <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" 
          id="org.apache.log4j.Priority.ERROR" /> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 

Wir haben auch eine log4j.properties Datei auf dem Classpath, die unsere regelmäßigen FileAppenders Details.

Ich weiß, das für viel des Guten sein kann, was Sie benötigen :)

1

Wenn Sie Jetty verwenden Sie zusätzliche CLASSPATHs auf Anwendungsbasis hinzufügen:

http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading#Adding_Extra_Classpaths_to_Jetty

Diese Sie ermöglichen wird, laden Sie Ihre log4 Eigenschaften in üblicher Weise (aus dem classpath :)

in web.xml:

 <listener> 
      <listener-class>org.springframework.web.util.Log4jWebConfigurer</listener-class> 
     </listener> 
     <context-param> 
      <param-name>log4jConfigLocation</param-name> 
      <param-value>classpath:${project.artifactId}-log4j.properties</param-value> 
     </context-param> 

in Anlegesteg-web.xml:

 <Set name="extraClasspath"> 
      <SystemProperty name="config.home" default="."/>/contexts/log4j 
     </Set> 
1

Sie Classpath statt fest codierten Pfad verwenden können.Es funktioniert für mich

<bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="sbeHome"> 
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> 
    <property name="targetMethod" value="initLogging" /> 
    <property name="arguments"> 
     <list> 
      <value>classpath:/conf/log4j.xml</value> 
     </list> 
    </property> 
</bean> 
+0

Das war so toll! Vielen Dank ! – Hatem

+0

Ist eine URL mit dieser Lösung möglich? –