Google App Engine を使用して、アプリケーションからいくつかのフラット データを csv 形式で公開しています。視覚化データソースライブラリの Google のDataTableとCsvRendererにより、データの変換が容易になり、ローカルの appengine 開発サーバーでのテストが成功しました。
Appspot インスタンスにデプロイすると、App Engine が IBM の ICU ライブラリのロギング方法を好まないことが明らかになりました。
Google App Engine は java.util.logging.Logger のサブクラスをサポートしていません: com/ibm/icu/impl/ICULogger
スタック トレースは起点を示します。
Caused by: java.lang.SecurityException: Google App Engine does not support subclasses of java.util.logging.Logger: com/ibm/icu/impl/ICULogger
at com.google.appengine.runtime.Request.process-0b3cd097cad783e6(Request.java)
at java.lang.ClassLoader.loadClass(ClassLoader.java:360)
at com.ibm.icu.util.TimeZone.<clinit>(TimeZone.java:114)
TimeZone の 114 行目:
/**
* {@icu} A logger for TimeZone. Will be null if logging is not on by way of system
* property: "icu4j.debug.logging"
* @draft ICU 4.4
* @provisional This API might change or be removed in a future release.
*/
public static ICULogger TimeZoneLogger = ICULogger.getICULogger(TimeZone.class.getName());
Eclipse にブレークポイントを設定し、デバッガーで単体テストを実行しました。TimeZoneLogger には null が割り当てられています。これは、ログを有効にするシステム プロパティがないためです。
/**
* Instantiates a new ICULogger object with logging turned off by default
* unless the system property "icu4j.debug.logging" is set to "all"
*
* @param name to be use by the logger (usually is the class name)
* @param resourceBundleName name to localize messages (can be null)
* @return a new ICULogger object
* @draft ICU 4.4
* @provisional This API might change or be removed in a future release.
*/
public static ICULogger getICULogger(String name, String resourceBundleName) {
LOGGER_STATUS flag = checkGlobalLoggingFlag();
if (flag != LOGGER_STATUS.NULL) {
ICULogger logger = new ICULogger(name, resourceBundleName);
/* Add a default handler to logger*/
logger.addHandler(new ConsoleHandler());
/* Turn off logging by default unless SYSTEM_PROP_LOGGER property is set to "all" */
if (flag == LOGGER_STATUS.ON) {
logger.turnOnLogging();
} else {
logger.turnOffLogging();
}
return logger;
}
return null;
}
TimeZoneLogger がインスタンス化されているかどうかを確認するためにいくつかのログ ステートメントを入力しましたが、インスタンス化されていないことが示されています。
[INFO] Oct 29, 2013 8:45:39 AM com.example.SomeClass
[INFO] WARNING: icu4j.debug.logging = null
[INFO] Oct 29, 2013 8:45:39 AM com.example.SomeClass
[INFO] WARNING: Time Zone Logger = null
これは、App Engine が好まないのはインスタンス化ではなく、単にクラスへの参照が問題の原因であることを示しています。
この時点で考えられるのは、違反コードを使用するクラスである独自の CSV レンダラーを作成することだけです。労力はそれほど大きくありませんが、特にライブラリとプラットフォームの両方が Google から提供されている場合は、既存のライブラリを使用することをお勧めします。
他の提案はありますか?