I can't

アクセスカウンタ

zoom RSS Google App Engine for JavaでLog4jを使えるようになるまで。

<<   作成日時 : 2010/03/07 20:15   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

今日は、GAE/Jでロギングしようとしてはまりまくったので、解決までの手順を書いておこうと思う。
ただ、自分でもこれが正しいか確信が持てないので、突っ込みは大歓迎です。

参考にしたサイト
tdtshのブログ
GAE/J (Google App Engine for java) で log4jを使う
http://www.tdtsh.com/blog/archives/493
GAE/J (Google App Engine for java) で 拡張log4jを使う(日本時間)
http://www.tdtsh.com/blog/archives/558

今週のキャリッジさん
GAE/Jでlog4jの日付を日本時間で出力する。
http://blog.cartn.jp/archives/454

北海道を愛するプログラマの覚書
Google App Engine/Javaでcommons-logging+Log4jでロギングする。
http://d.hatena.ne.jp/tetsuya_odaka/20090731/1249031693


とりあえず、EclipseのGAE/SDKで新規プロジェクトを作って動くことを確認する。
何も加えていない状態が、これ↓
package example;
import java.io.IOException;
import javax.servlet.http.*;
@SuppressWarnings("serial")
public class WindgracetestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}
で、これに基本的なロギング処理を加えたものがこれ↓
package example;
import java.io.IOException;
import javax.servlet.http.*;
import com.google.appengine.repackaged.org.apache.commons.logging.Log;
import com.google.appengine.repackaged.org.apache.commons.logging.LogFactory;
@SuppressWarnings("serial")
public class WindgracetestServlet extends HttpServlet {
private static final Log logger = LogFactory.getLog(WindgracetestServlet.class);
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
logger.info("Servlet:Start");
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
logger.info("Servlet:end");
}
}
これにアクセスしようとすると、失敗し、GAEのログに↓が出力される。
Nested in javax.servlet.ServletException: init:
java.lang.NoClassDefFoundError: com/google/appengine/repackaged/org/apache/commons/logging/LogFactory
...
Caused by: java.lang.ClassNotFoundException: com.google.appengine.repackaged.org.apache.commons.logging.LogFactory

/windgracetest
java.lang.NoClassDefFoundError: com/google/appengine/repackaged/org/apache/commons/logging/LogFactory
...
Uncaught exception from servlet
java.lang.NoClassDefFoundError: com/google/appengine/repackaged/org/apache/commons/logging/LogFactory
...
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.google.appengine.repackaged.org.apache.commons.logging.LogFactory
...

どうやら、クラスが見つからないらしい……SDKにはあるのに。
仕方が無いので、eclipse\plugins\com.google.appengine.eclipse.sdkbundle.1.3.1_1.3.1.v201002101412\appengine-java-sdk-1.3.1\lib\shared\jspから、WEB-INFのLibにrepackaged-appengine-commons-logging-1.1.1.jarをコピーして、
EclipseからJarの登録をする。
(プロジェクトエクスプローラの該当するプロジェクトを左クリックし、「プロパティ」から「Javaのビルドバス」の「jarの追加」で、war\WEB-INF\lib\repackaged-appengine-commons-logging-1.1.1.jarを指定してやる。)

そして、デプロイすると、サーブレットの実行には成功する(Hello, worldが表示される)がログには何も表示されない。
これはデフォルトのログレベルがWARNINGのためなので、\war\WEB-INF\logging.propertiesを書き変える。
変更前の「logging.properties」↓
# A default java.util.logging configuration.
# (All App Engine logging is through java.util.logging by default).
#
# To use this configuration, copy it into your application's WEB-INF
# folder and add the following to your appengine-web.xml:
#
# <system-properties>
# <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
# </system-properties>
#
# Set the default logging level for all loggers to WARNING
.level = WARNING
# Set the default logging level for ORM, specifically, to WARNING
DataNucleus.JDO.level=WARNING
DataNucleus.Persistence.level=WARNING
DataNucleus.Cache.level=WARNING
DataNucleus.MetaData.level=WARNING
DataNucleus.General.level=WARNING
DataNucleus.Utility.level=WARNING
DataNucleus.Transaction.level=WARNING
DataNucleus.Datastore.level=WARNING
DataNucleus.ClassLoading.level=WARNING
DataNucleus.Plugin.level=WARNING
DataNucleus.ValueGeneration.level=WARNING
DataNucleus.Enhancer.level=WARNING
DataNucleus.SchemaTool.level=WARNING

変更後の「logging.properties」↓
# A default java.util.logging configuration.
# (All App Engine logging is through java.util.logging by default).
#
# To use this configuration, copy it into your application's WEB-INF
# folder and add the following to your appengine-web.xml:
#
# <system-properties>
# <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
# </system-properties>
#
# Set the default logging level for all loggers to WARNING
.level = INFO
# Set the default logging level for ORM, specifically, to WARNING
DataNucleus.JDO.level=WARNING
DataNucleus.Persistence.level=WARNING
DataNucleus.Cache.level=WARNING
DataNucleus.MetaData.level=WARNING
DataNucleus.General.level=WARNING
DataNucleus.Utility.level=WARNING
DataNucleus.Transaction.level=WARNING
DataNucleus.Datastore.level=WARNING
DataNucleus.ClassLoading.level=WARNING
DataNucleus.Plugin.level=WARNING
DataNucleus.ValueGeneration.level=WARNING
DataNucleus.Enhancer.level=WARNING
DataNucleus.SchemaTool.level=WARNING

この変更を保存後、デプロイし、サーブレットにアクセスすると、ログが表示される。

03-07 02:25AM 46.242
example.WindgracetestServlet doGet: Servlet:Start
03-07 02:25AM 46.254
example.WindgracetestServlet doGet: Servlet:end


普通にロギングするだけならこれでもよさそうなのだが、私の頭はJSTで動いているので、
どうにかしてJSTでログに時間を表示したい。
そのために、Log4JとLog4JExtraをダウンロードしてくる。
Download Apache log4j 1.2.15
http://logging.apache.org/log4j/1.2/download.html
Download apache-log4j-extras
http://logging.apache.org/log4j/companions/extras/download.html
ダウンロードしたファイルを解凍してlog4j-1.2.15.jarとapache-log4j-extras-1.0.jarを\war\WEB-INF\libにコピーし、jarの登録を行う。
appengine-web.xmlを変更する。

変更前の「appengine-web.xml」↓
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>windgracetest</application>
<version>1</version>

<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
</appengine-web-app>

変更後の「appengine-web.xml」↓
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>windgracetest</application>
<version>1</version>

<system-properties>
<property name="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.Log4JLogger"></property>
<property name="java.util.logging.config.file" value="WEB-INF/classes/log4j.properties"></property>

</system-properties>
</appengine-web-app>
(※2010/03/29変更、取り消し線の個所は無くても動作することを確認)
さらに\src\log4j.propertiesも書き換える。
変更前の「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.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.EnhancedPatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}{Asia/Tokyo} %-5p - %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

そして、このアプリケーションを保存し、デプロイ、実行する。
そうするとサーブレットの実行には成功するが、ログにWARNINGが出力される。
03-07 02:52AM 31.267
[windgracetest/1.340365181580114196].<stderr>: log4j:WARN No appenders could be found for logger (example.WindgracetestServlet).
03-07 02:52AM 31.272
[windgracetest/1.340365181580114196].<stderr>: log4j:WARN Please initialize the log4j system properly.

どうやら、Log4Jの設定がうまくいってないようだ。
\src\log4j.propertiesにさらに設定を追加する。
変更前の「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.EnhancedPatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}{Asia/Tokyo} %-5p - %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.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.rootLogger=debug, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}{Asia/Tokyo} %-5p - %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

これを保存、デプロイ、実行するとログには以下のように表示される。
03-07 03:00AM 53.329
[windgracetest/1.340365304485596719].<stdout>: 2010-03-07 20:00:53,328 INFO - Servlet:Start
03-07 03:00AM 53.337
[windgracetest/1.340365304485596719].<stdout>: 2010-03-07 20:00:53,337 INFO - Servlet:end

これで、日本時間がログに表示されるようになった。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
Google App Engine for JavaでLog4jを使えるようになるまで。 I can't/BIGLOBEウェブリブログ
文字サイズ:       閉じる