Google App Engineでcron(サーブレット)を動かす際に、ログを出力(確認)したい場合の対処法。(公式の説明はこちらを参照。)
管理コンソールの “Main”-”Logs”を開くとログレベルを5段階(Debug,Info,Warning,Error,Critical)に分けて表示されているが、仕様としてユーザが開発したコードからの出力も処理できるようになっていて、標準ではコードからの出力を以下のようにレベル分けしている。
・標準出力(System.out):Info
・標準エラー出力(System.err):Warning
一方、アプリケーションのログに関する設定は、WEB-INFの下の’appengine-web.xml’, ‘logging.properties’の2つのファイルに定義されていて、デフォルト状態では以下のようになっている。
<!-- appengine-web.xml より抜粋-->
<!-- Configure java.util.logging -->
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
# logging.propertiesより抜粋 # Set the default logging level for all loggers to WARNING .level = WARNING
すなわち、取り込むログのレベルが’Warning’になっているので、そのままでは標準出力がトラップされない。そこで、
(1)取り込むエラーレベルを’Info’に拡大する、または
(2)java.util.logging.Loggerを利用して明示的にログを出力する
ことで、管理コンソールからもログが見れるようになる。
(2)については以下のようにコードを書けばOK。
// Java
import java.util.logging.Logger;
// ...
public class MyServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(MyServlet.class.getName());
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
log.info("An informational message.");
log.warning("A warning message.");
log.severe("An error message.");
}
}
なお、標準出力の内容もトラップできるので、log4jなどのメジャーなツールも利用できる。