2010-12-09 73 views
30

我有一个网络应用程序,它使用Spring的Log4jConfigurer类来初始化我的Log4J日志工厂。基本上它使用一个不在类路径中的配置文件来初始化Log4J。用Spring初始化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?还是有其他方法可以解决这个问题?

回答

47

你可以在web.xml代替弹簧的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> 

所以它是春天开始之前配置的Log4j听众。

+0

我应该提到,我的路径log4J属性文件来自JNDI字符串。我如何将该JNDI值提供给。如果我能做到这一点,我想我已经全部准备好了。 – HDave 2010-12-09 16:46:31

+4

我发现这个:http://www.coderanch.com/t/362833/Servlets/java/log-ServletContextListener - 它显示了如何实现你自己的log4j配置监听器,它通过JNDI获得一些信息 – Ralph 2010-12-09 16:55:28

+0

我创建了我自己的servlet上下文监听器就像他们做的一样,并且它完美地工作。谢谢。 – HDave 2010-12-09 18:40:18

4

而非自行配置log4j的代码,为什么不只是你的(自定义)配置文件的位置点的log4j加入

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

到您的服务器的启动性能?

更好的是,只需将log4j.xml移动到默认位置 - 在类路径上 - 并让log4j自动进行自我配置。

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> 

我们也有,详细介绍我们的常规FileAppenders类路径中log4j.properties文件。

我意识到这可能是矫枉过正你需要:)

1

如果您使用的码头,你可以在每个应用的基础上添加额外的类路径:

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> 

在码头-web.xml中:

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

您可以使用,而不是硬编码路径类路径。它适用于我

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