Google App Engine/Javaでcommons-logging+Log4jでロギングする。

Google App Engineのスタブ(appengine-web.xml)に

<!-- Configure java.util.logging -->
<system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>

とあるように、デフォルトの設定ではjava.util.loggingを使う設定になっている。

これと一緒に、src下にlog4j.propertiesの雛形が用意されている。

先のログでDWR2を配備した際に、commons-loggingを配置した。DWRは「org.directwebremoting.util.CommonsLoggingOutput」という奴が、commons-loggingを使って、Infoレベルで余計なログを吐く。
開発の際には、debugログが必要になるので、log4jを使う設定に変えてみる。

log4j.jarの追加

war/WEB-INF/libに、手持ちのlog4j-1.2.15.jarをコピー(ちょいといい加減)。

appengine-web.xmlの変更

commons-loggingは、システムプロティーの設定を見に行く。これは、(上記のように)appengine-web.xmlに設定されているので、これを変更する。

<system-properties>
    <property name="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.Log4JLogger"/>
</system-properties>

lo4j.propertiesの変更

A2というアペンダーを追加する。rootをDEBUGにして、DWRパッケージはWARN以上に設定。

log4j.rootLogger=DEBUG,A2
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n
log4j.logger.org.directwebremoting=WARN,A2

Demo.javaの変更

debugログを吐くように、Demo.javaを変更。呼び出されたら「say hello called. '渡された値(name)'」をConsoleに出力する。

package test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * DWRのデモ
 * 
 * 名前(name)を受け取って、「こんにちは、name」を返す。
 * 
 */
public class Demo {
    
    private static final Log log = LogFactory.getLog(Demo.class);
    
    public String sayHello(String name) {
        log.debug("say hello called. "+name);
        return "こんばんわ " + name + " さん";
    }
}

デプロイと実行

いつもどおりにデプロイして、以下の画面を実行した。

以下がGAEの管理画面に上がったログ。時刻表示は米国時間っぽい。サーバーのシステム時刻かなぁ。直し方が分からない(クラウド環境でそもそも直せるのかな。とりあえず、スルー)。DEBUGモードで書き出されたことが分かるが、GAE上はInfomationの扱いになっている。それと、日本語はログに吐き出せなかった。できるのかな(これもスルーしとこう)?


(注記)上の例では、昔風にlog4j.propertiesになっているが、xml形式のlog4j.xmlにしてもOK。