先日、GAE SDK for Javaでのログのダウンロードについて書きました。

GAE/Jはデフォルトでjava.util.loggingを使う様になっていますが、デフォルトのままではデバッグの時ちょっと見づらいです。

そこで、設定ファイルの使い慣れている log4j に移行する事にしました。

 


プロジェクトへ log4j.jar を追加

apache.orgから、log4j-1.2.15.jar をダウンロードして、war/WEB-INF/libに置きます。

この辺の依存性の管理は、後日 maven でやりたいなぁ。

 


設定ファイルの編集

以前構築したeclipseの開発環境では、src/log4j.properties がデフォルトで作成されていました。

これを編集すれば良いようです。

デフォルトでは、こうなっています。

# A default log4j configuration for log4j users.
#
#
# To use this configuration, deploy it into your application's WEB-INF/classes
# directory.  You are also encouraged to edit it as you like.

# Configure the console as our one appender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n


# tighten logging on the DataNucleus Categories
log4j.category.DataNucleus.JDO=WARN, A1
log4j.category.DataNucleus.Persistence=WARN, A1
log4j.category.DataNucleus.Cache=WARN, A1
log4j.category.DataNucleus.MetaData=WARN, A1
log4j.category.DataNucleus.General=WARN, A1
log4j.category.DataNucleus.Utility=WARN, A1
log4j.category.DataNucleus.Transaction=WARN, A1
log4j.category.DataNucleus.Datastore=WARN, A1
log4j.category.DataNucleus.ClassLoading=WARN, A1
log4j.category.DataNucleus.Plugin=WARN, A1
log4j.category.DataNucleus.ValueGeneration=WARN, A1
log4j.category.DataNucleus.Enhancer=WARN, A1
log4j.category.DataNucleus.SchemaTool=WARN, A1

上記に、ルートロガーの定義

log4j.rootLogger=INFO, A1

を追記して、

ログファイルのフォーマットを好みに変更

log4j.appender.appLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%F:%L] - %m%n

して、

Jakarta Velocity関係のデバッグログとかが多くて困るので、

log4j.logger.org.apache.velocity=WARN,A1

WARNに変更する設定を追加しました。

最終的にこうなりました。

#
# log4j.properties for GAE/J
#

log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.appLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%F:%L] - %m%n
log4j.logger.org.apache.velocity=WARN,A1

log4j.category.DataNucleus.JDO=WARN, A1
log4j.category.DataNucleus.Persistence=WARN, A1
log4j.category.DataNucleus.Cache=WARN, A1
log4j.category.DataNucleus.MetaData=WARN, A1
log4j.category.DataNucleus.General=WARN, A1
log4j.category.DataNucleus.Utility=WARN, A1
log4j.category.DataNucleus.Transaction=WARN, A1
log4j.category.DataNucleus.Datastore=WARN, A1
log4j.category.DataNucleus.ClassLoading=WARN, A1
log4j.category.DataNucleus.Plugin=WARN, A1
log4j.category.DataNucleus.ValueGeneration=WARN, A1
log4j.category.DataNucleus.Enhancer=WARN, A1
log4j.category.DataNucleus.SchemaTool=WARN, A1

 

  • * *あとは、こんなユーティリティクラスを作っておいて、

package my.package.util;

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

public class MyLog {
    public static final Log log = LogFactory.getLog(MyLog.class);
}

コードの中で、こんな風に書くだけです。

MyLog.log.info("something to logging");

こでで、eclipse上のコンソールログはちゃんと出る様になりました。

 


App Engine上でのログ出力

WEB-INF/appengine-web.xml を編集します。

デフォルトでは、こうなっています。

こんな風に修正します。

これで一応、appengine.google.comのlogsに出力される様になりました。

でもちょっと見にくい。時間もずれとるし。

今後の課題です。

参考サイト

Google App Engine/Javaでcommons-logging+Log4jでロギングする。 – 北海道を愛するプログラマの覚書