以下はPCで動作しますが、Androidシミュレーター内では動作しないことに気づきました。
Logger logger = Logger.getLogger("foo");
logger.log(Level.INFO, "Number is: {0}", new Object[]{new Integer(42)});
印刷するだけです
Number is: {0}
なぜこれはAndroidで失敗するのですか?
回りくどい方法で解決策を見つけました。最終的には、デフォルトのandroidロギング実装のどこかに、パラメーターを無視してメッセージのみをレンダリングするフォーマッターがあると思います。Logging APIを使用して、独自のデザインのフォーマッターをインストールできるはずです。
まったく別の理由で、すでに新しいハンドラーをインストールしていました。私が使用したソースはここから入手できます:http://4thline.org/projects/download/misc/
ハンドラーはteleal-common-1.0.14-source.tar.gzアーカイブにあります。src \ main \ java \ org \ fourthline \ android \ util\FixedAndroidHandler.javaへのパスをたどります。
このサイトには、このハンドラーをインストールするためのコードも用意されていますが、別のアーカイブにあります:sash-1.0-SNAPSHOT.tar.gz。1.0 \ src \ main \ java \ org \ teleal \ common \ logging\LoggingUtil.javaを見つけます。
このハンドラーをインストールするには、アプリのスタートアップコードのどこかでこの呼び出しを行います。
LoggingUtil.resetRootHandler(new FixedAndroidHandler());
私が見つけたのは、このハンドラーのフォーマッターがハンドラー内に匿名クラスとして埋め込まれていることでした。なんて都合のいい。FormatterがLogRecordを介して渡されたパラメーターを処理しなかったことがわかりました。「else-if」条件を追加しました。
private static final Formatter THE_FORMATTER = new Formatter() {
@Override
public String format(LogRecord r) {
String msg = r.getMessage();
Object[] params = r.getParameters();
Throwable thrown = r.getThrown();
if (thrown != null) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
sw.write(r.getMessage());
sw.write("\n");
thrown.printStackTrace(pw);
pw.flush();
return sw.toString();
} else if ((params != null) && (params.length > 0) && (msg.indexOf("{0") >= 0)) {
return MessageFormat.format(msg, params);
} else {
return r.getMessage();
}
}
};
ifテストは、私が見た他のログフォーマットコードと一致しています。理論的には、既存のハンドラーに同様のフォーマッターをインストールするという、より直接的なアプローチを取ることができるはずです。上記の解決策が私のために働いているという事実のために、私はこれを自分で試していません。
静的メソッドを使用して同じString
フォーマットを実現できます。String.format(String format, Object... args)
Log.d(TAG, String.format("Number is: %d", new Integer(42)));
使用する:
android.util.Log.i(TAG, "Number is: " + number);
http://developer.android.com/reference/android/util/Log.htmlを参照してください