[java][log4j]設定ファイルの上書き読み込み 2006/09/05
2008/01/20

アプリケーションログを出力するのにcommons-loggingとlog4jをよく使用しています。



log4jを使用していて、

設定ファイルにアプリケーションログの出力パスを決めうちで書いていると動作環境が違う場合に対応しないといけい場合が発生します。



下記のように対応しています。



(1)デフォルトのlog4j.xmlファイルを用意します。

(2)log4j.override.xmlファイルを用意します。

動的に変更したい設定は${環境変数}を利用して記述しておきます。

(3)まず、アプリケーションのスタートアップで環境変数を準備して、

Log4jUtilsクラスで設定ファイルを上書き読み込み(log4j.override.xmlの読み込み)します。



デフォルトのlog4j.xmlの例

標準出力を行います。



<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender" >

<param name="threshold" value="debug"/>

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern"

value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>

</layout>

</appender>

<root>

<priority value="debug" />

<appender-ref ref="STDOUT" />

</root>

</log4j:configuration>





デフォルトのlog4j設定上書きするlog4j.override.xmlファイル例です。

ログをファイルに出力します。



<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">



<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<!--

you must set env parameter ${service.home}.

ex. System.setProperty("your.log.filepath", FILE_PATH);

-->

<appender name="OPERATING_LOG_APPENDER"

class="org.apache.log4j.RollingFileAppender">

<param name="File" value="${your.log.filepath}"/>

<param name="Append" value="true"/>

<param name="MaxFileSize" value="10MB"/>

<param name="MaxBackupIndex" value="10"/>

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern"

value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>

</layout>

</appender>



<root>

<appender-ref ref="OPERATING_LOG_APPENDER"/>

</root>

</log4j:configuration>





Log4jUtilsユーティリティクラスの例です。





import org.apache.log4j.LogManager;

import org.apache.log4j.xml.DOMConfigurator;



public abstract class Log4jUtils {



static final String OVERRIDE_LOG4J_XML = "log4j.override.xml";



public static void initializeLog4jxml() {

initializeLog4jxml(OVERRIDE_LOG4J_XML);

}

public static void initializeLog4jxml(String log4jxml) {

new DOMConfigurator().doConfigure(Thread.currentThread().getContextClassLoader()

.getResource(log4jxml), LogManager.getLoggerRepository());



}

}







log4jサイト http://logging.apache.org/



設定情報の上書きというテクニックはいろいろな状況で有効なのではないでしょうか。

: