用Spring初始化Log4J?

HDa*_*ave 30 java spring log4j web-applications

我有一个使用Spring的Log4jConfigurer类来初始化我的Log4J日志工厂的Web应用程序.基本上它使用不在类路径中的配置文件初始化Log4J.

这是配置:

<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>
Run Code Online (Sandbox Code Playgroud)

但是我在应用程序启动时收到此错误:

log4j:WARN No appenders could be found for logger

大量的Spring应用程序上下文初始化消息被打印到控制台.我认为这是因为Spring在有机会初始化我的记录器之前正在开始初始化我的应用程序.如果它很重要,我在Log4J上使用SLF4J.

有没有办法让我的Log4jConfigurer成为第一个初始化的bean?还是有其他方法来解决这个问题?

Ral*_*lph 47

您可以在web.xml中配置Log4j侦听器,而不是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>
Run Code Online (Sandbox Code Playgroud)

所以它在Spring开始之前就已经开始了.

  • 我发现了这个:http://www.coderanch.com/t/362833/Servlets/java/log-ServletContextListener - 它显示了如何实现自己的log4j配置监听器,它通过JNDI获取一些信息 (4认同)

Har*_*ime 7

我们的独立应用程序需要SMTPAppender一个spring配置文件中已存在电子邮件配置的地方,我们不希望在该配置文件中复制该配置文件log4j.properties.

我把以下内容放在一起,使用spring添加额外的appender.

<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>
Run Code Online (Sandbox Code Playgroud)

我们log4j.properties在类路径上也有一个文件,详细说明了我们的常规文件FileAppenders.

我意识到这对你所需要的东西可能有点过分了:)