web-dev-qa-db-ja.com

SpringでLog4Jを初期化しますか?

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に初期化する方法はありますか?またはこれを解決する他の方法はありますか?

30
HDave

Spring-context.xmlの代わりにweb.xmlでLog4jリスナーを設定できます

<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が開始される前にアップします。

47
Ralph

スタンドアロンアプリケーションにはSMTPAppenderが必要であり、電子メールの構成はspring構成ファイルに既に存在し、log4j.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>

また、通常のFileAppendersを詳述するlog4j.propertiesファイルがクラスパスにあります。

私はこれがあなたが必要とするものにとってはやり過ぎかもしれないことを理解しています:

7
Harry Lime

Log4jをコードで自分で構成するのではなく、追加して、log4jを(カスタム)構成ファイルの場所に向けないでください。

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

サーバーの起動プロパティに?

さらに良いのは、log4j.xmlをクラスパス上のデフォルトの場所に移動するだけで、log4jが自動的に設定されるようにすることです。

4
matt b

ハードコードされたパスの代わりにクラスパスを使用できます。わたしにはできる

<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>
2
ravi ranjan

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>
1
Mond Raymond