web-dev-qa-db-fra.com

Initialisation de Log4J avec Spring?

J'ai une application Web qui utilise _ Log4jConfigurer classe pour initialiser ma fabrique de journaux Log4J. Fondamentalement, il initialise Log4J avec un fichier de configuration hors du chemin d'accès aux classes.

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

Cependant, j'obtiens cette erreur au démarrage de l'application:

log4j:WARN No appenders could be found for logger

et des tonnes de messages d'initialisation du contexte de l'application Spring sont imprimés sur la console. Je pense que c'est parce que Spring travaille à initialiser mon application avant d'avoir la possibilité d'initialiser mon enregistreur. Au cas où cela importerait, j'utilise SLF4J en plus de Log4J.

Existe-t-il un moyen pour que mon Log4jConfigurer soit le premier bean initialisé? ou existe-t-il un autre moyen de résoudre ce problème?

30
HDave

Vous pouvez configurer votre écouteur Log4j dans le web.xml au lieu du spring-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>

C'est donc avant le début du printemps.

47
Ralph

Notre application autonome nécessitait un SMTPAppender où la configuration de messagerie existe déjà dans un fichier de configuration spring et nous ne voulions pas que cela soit dupliqué dans le log4j.properties.

J'ai rassemblé les éléments suivants pour ajouter un appender supplémentaire à l'aide du ressort.

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

Nous avons également un log4j.properties fichier sur le chemin de classe qui détaille notre FileAppenders régulier.

Je me rends compte que cela peut être exagéré pour ce dont vous avez besoin :)

7
Harry Lime

Plutôt que de configurer log4j vous-même dans le code, pourquoi ne pas simplement pointer log4j vers l'emplacement de votre fichier de configuration (personnalisé) en ajoutant

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

aux propriétés de démarrage de votre serveur?

Encore mieux, déplacez simplement log4j.xml vers l'emplacement par défaut - sur le chemin de classe - et laissez log4j se configurer automatiquement.

4
matt b

Vous pouvez utiliser classpath au lieu d'un chemin codé en dur. Ça marche pour moi

<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>
2
ravi ranjan

Si vous utilisez Jetty, vous pouvez ajouter des chemins de classe supplémentaires par application:

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

Cela vous permettra de charger vos propriétés log4 de manière standard (à partir du chemin de classe :)

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

dans jetty-web.xml:

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