用弹簧初始化Log4J?

2022-09-01 10:32:58

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

以下是配置:

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

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

log4j:WARN No appenders could be found for logger

大量的Spring应用程序上下文初始化消息被打印到控制台。我认为这是因为Spring正在做一些工作来初始化我的应用程序,然后才有机会初始化我的记录器。如果这很重要,我在Log4J之上使用SLF4J。

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


答案 1

您可以在 Web 中配置 Log4j 侦听器.xml而不是 spring 上下文.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>

因此,在春天开始之前,它就结束了。


答案 2

我们的独立应用程序需要一个电子邮件配置已经存在于配置文件中的位置,我们不希望在 .SMTPAppenderspringlog4j.properties

我把下面放在一起,用弹簧添加一个额外的附加物。

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

我们在类路径上还有一个文件,其中详细说明了我们的常规.log4j.propertiesFileAppenders

我意识到这可能对于你需要的东西来说有些过分:)


推荐