開発サーバとプロダクション環境でログの設定を切り替える方法

Google App Engine/Java(以下GAE)で開発をしていてはまったのでメモ。

GAEで開発するならばEclipseを使うかと思いますが、GAE Plugin は必要最低限の機能を提供している感じです。したがって、プロダクション環境にアップロードされる形を意識しながら開発もしなければならないです。ほとんどの場合はそれはあまり問題になりませんが、開発サーバとプロダクションサーバで設定を変えたいような場合に苦労します。そうログの設定とか。

よく行うパターンとしては、開発サーバ用のlogging.propertiesを用意しておき、
1. プロダクションサーバにデプロイしないようにデプロイの設定を行う
2. 開発サーバの起動オプションなどで設定を行う
3. プログラム上で自動的に判別して設定を行う
の3パターンが解決策として考えられます。

一番スマートな方法は1ですが、EclipseのGAE Pluginで対応していないため、自分でAntやMavenの設定を書く必要があります。書けばいいんですけど、Eclipse上で開発を完結したいところ。
次に3ですが、GAEの場合、spin-upの問題もある為、不要な処理は可能な限りやりたくないです。特に開発サーバだけで動くような処理については避けられるものならば避けたいところ。メリットが多ければいいのですが、そこまで・・・という気がします。
というわけでなんとか、2の開発サーバの起動オプションでどうにかしたいわけです。

デフォルトではGAEでログの設定を行うにはappengine-web.xml で設定します(抜粋)。






java.util.loggingを使ったことがある人ならばピンときますが、これはVMの起動引数で与える形式です。したがって、以下のように設定しても動くだろうと予想できます。

java -Djava.util.logging.config.file=WEB-INF/classes/logging.properties ....

結論としては動くのですが、ここで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:
#
#
#
#

#
# Set the default logging level for all loggers to WARNING
.level = INFO
# Set the default logging level for ORM, specifically, to WARNING
com.google.appengine.repackaged.level=WARNING

コメントにもappengine-web.xmlでしてくれと書いてあるのが解りますね。

これをlogging.dev.propertiesにコピーしてINFOをFINEにして、WebApplicationのVM起動引数に「-Djava.util.logging.config.file=WEB-INF/classes/logging.dev.properties」を追加します。が、・・・・ログがまったく表示されませんorz

正しい設定方法

実はappengine-web.xmlでの設定の場合、logging.propertiesが単純に読み込まれて使用されるわけではないようです。Handlerなどの設定を追加した上で反映される為、設定ファイルをそのまま使うことに問題があります。したがって、logging.dev.propertiesにHandlerの記述が必要です。

# A java.util.logging configuration for development server.
.level = FINE
# handlers
handlers= java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = FINE

com.google.appengine.repackaged.level=INFO
org.slim3.level=INFO

後はVM起動の引数に「-Djava.util.logging.config.file=WEB-INF/classes/logging.dev.properties」を追加すれば開発サーバでは詳細なログを表示できます。
尚、war内のどこにlogging.dev.propertiesを設置しても構いませんが、パスはwarからの相対パスで書くこととWEB-INF以下に配置しなければ外部に見えてしまう可能性があることを忘れないようにしてください。個人的にはslim3と同様にclassesに配置し、本体はsrcフォルダに置くことをオススメします。

尚、slim3 1.03以前のBlankプロジェクトではtestフォルダにlogging.dev.propertiesを配置すると、ビルドしたクラスファイルがwar/WEB-INF/classes配下にコピーされないので注意してください。