Initializing Log4J with Spring?

前端 未结 5 1912
说谎
说谎 2020-11-28 06:30

I have a web app that uses Spring\'s Log4jConfigurer class to initialize my Log4J log factory. Basically it initializes Log4J with a config file that is off th

相关标签:
5条回答
  • 2020-11-28 07:09

    Rather than configuring log4j yourself in code, why not just point log4j at your (custom) configuration file's location by adding

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

    to your server's startup properties?

    Even better, just move log4j.xml to the default location - on the classpath - and let log4j configure itself automatically.

    0 讨论(0)
  • 2020-11-28 07:13

    You could configure your Log4j listener in the web.xml instead of the 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>
    

    So it is up before Spring starts.

    0 讨论(0)
  • 2020-11-28 07:21

    If you are using Jetty you can add extra classpaths on a per application basis:

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

    This will allow you to load your log4 properties in a standard manner (from the classpath:)

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

    in jetty-web.xml:

            <Set name="extraClasspath">
                <SystemProperty name="config.home" default="."/>/contexts/log4j
            </Set>
    
    0 讨论(0)
  • 2020-11-28 07:27

    You can use classpath instead of hardcoded path. 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>
    
    0 讨论(0)
  • 2020-11-28 07:30

    Our standalone application required an SMTPAppender where the email config already exists in a spring config file and we didn't want that to be duplicated in the log4j.properties.

    I put the following together to add an extra appender using spring.

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

    We also have a log4j.properties file on the classpath which details our regular FileAppenders.

    I realise this may be overkill for what you require :)

    0 讨论(0)
提交回复
热议问题