Inicjowanie Log4J za pomocą Springa?

Mam aplikację internetową, która używa klasy Springa Log4jConfigurer do inicjalizacji mojej fabryki log4j. W zasadzie inicjalizuje Log4J za pomocą pliku konfiguracyjnego, który znajduje się poza ścieżką klasy.

Oto konfiguracja:

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

Jednak dostaję ten błąd przy starcie aplikacji:

log4j:WARN No appenders could be found for logger

I mnóstwo komunikatów inicjalizacji kontekstu aplikacji Spring są drukowane na konsoli. Myślę, że to dlatego, że Spring robi pracę, aby zainicjować moją aplikację, zanim ma szansa na zainicjowanie mojego rejestratora. Jeśli to ma znaczenie, używam SLF4J na Log4J.

Czy Jest jakiś sposób, aby mój Log4jConfigurer był pierwszym Bean zainicjalizowanym? a może jest jakiś inny sposób, by to rozwiązać?

Author: HDave, 2010-12-09

5 answers

Możesz skonfigurować swój słuchacz Log4j w sieci.xml zamiast 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>

Więc jest przed rozpoczęciem wiosny.

 47
Author: Ralph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 13:00:37

Nasza samodzielna aplikacja wymagała SMTPAppender, gdzie Konfiguracja poczty e-mail już istnieje w pliku konfiguracyjnym spring i nie chcieliśmy, aby była duplikowana w log4j.properties.

Połączyłem następujące elementy, aby dodać dodatkowy appender za pomocą sprężyny.

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

Mamy również plik log4j.properties na classpath, który zawiera szczegóły naszego zwykłego FileAppenders.

Zdaję sobie sprawę, że to może być przesada dla tego, czego potrzebujesz:)

 7
Author: Harry Lime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-06 10:57:08

Zamiast samemu konfigurować log4j w kodzie, dlaczego po prostu nie skierować log4j na lokalizację swojego (niestandardowego) pliku konfiguracyjnego, dodając

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

Do właściwości startowych twojego serwera?

Nawet lepiej, po prostu przesuń log4j.xml do domyślnej lokalizacji-na classpath - i niech log4j skonfiguruje się automatycznie.

 4
Author: matt b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 16:44:54

Możesz użyć classpath zamiast ścieżki zakodowanej na twardo. It works for me

<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
Author: ravi ranjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 13:26:28

Jeśli używasz Jetty, możesz dodać dodatkowe ścieżki klas dla każdej aplikacji:

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

To pozwoli Ci załadować swoje właściwości log4 w standardowy sposób (ze ścieżki klasowej:)

W sieci.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>

W jetty-web.xml:

        <Set name="extraClasspath">
            <SystemProperty name="config.home" default="."/>/contexts/log4j
        </Set>
 1
Author: Mond Raymond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-21 21:20:13