GAE/J (Google App Engine for java) で log4jを使う
先日、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 を編集します。
デフォルトでは、こうなっています。
<system-properties>
<property name=”java.util.logging.config.file” value=”WEB-INF/logging.properties”/>
</system-properties>
こんな風に修正します。
<system-properties>
<property name=”java.util.logging.config.file” value=”WEB-INF/classes/log4j.properties”/>
</system-properties>
これで一応、appengine.google.comのlogsに出力される様になりました。
でもちょっと見にくい。時間もずれとるし。
今後の課題です。
参考サイト
Google App Engine/Javaでcommons-logging+Log4jでロギングする。 – 北海道を愛するプログラマの覚書