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に初期化する方法はありますか?またはこれを解決する他の方法はありますか?
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が開始される前にアップします。
スタンドアロンアプリケーションには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
ファイルがクラスパスにあります。
私はこれがあなたが必要とするものにとってはやり過ぎかもしれないことを理解しています:
Log4jをコードで自分で構成するのではなく、追加して、log4jを(カスタム)構成ファイルの場所に向けないでください。
-Dlog4j.configuration=.../conf/log4j.xml
サーバーの起動プロパティに?
さらに良いのは、log4j.xmlをクラスパス上のデフォルトの場所に移動するだけで、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>classpath:/conf/log4j.xml</value>
</list>
</property>
</bean>
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>