我有一个使用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>
但是我在应用程序启动时收到此错误:
log4j:WARN No appenders could be found for logger
将大量的Spring应用程序上下文初始化消息打印到控制台。我认为这是因为Spring在有机会初始化我的记录器之前正在开始初始化我的应用程序。如果它很重要,我在Log4J上使用SLF4J。
有什么方法可以让我的Log4jConfigurer成为第一个初始化的bean?或者还有其他方法可以解决这个问题吗?
答案 0 :(得分:48)
您可以在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>
所以它在Spring开始之前就已经开始了。
答案 1 :(得分:8)
我们的独立应用程序需要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>
我们在类路径上还有一个log4j.properties
文件,详细说明了常规FileAppenders
。
我意识到这对你所需要的东西可能有点过分了。)
答案 2 :(得分:4)
不是在代码中自己配置log4j,为什么不通过添加
将log4j指向您的(自定义)配置文件的位置?-Dlog4j.configuration=.../conf/log4j.xml
到服务器的启动属性?
更好的是,只需将log4j.xml移到默认位置 - 在类路径上 - 让log4j自动配置自己。
答案 3 :(得分:2)
您可以使用classpath而不是硬编码路径。它对我有用
<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>
答案 4 :(得分:1)
如果您使用的是Jetty,则可以在每个应用程序的基础上添加额外的类路径:
http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading#Adding_Extra_Classpaths_to_Jetty
这将允许您以标准方式(从类路径:)
加载log4属性 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>
在jetty-web.xml中:
<Set name="extraClasspath">
<SystemProperty name="config.home" default="."/>/contexts/log4j
</Set>