4

以下はPCで動作しますが、Androidシミュレーター内では動作しないことに気づきました。

Logger logger = Logger.getLogger("foo");
logger.log(Level.INFO, "Number is: {0}", new Object[]{new Integer(42)});

印刷するだけです

Number is: {0}

なぜこれはAndroidで失敗するのですか?

4

3 に答える 3

5

回りくどい方法で解決策を見つけました。最終的には、デフォルトの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.gz1.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テストは、私が見た他のログフォーマットコードと一致しています。理論的には、既存のハンドラーに同様のフォーマッターをインストールするという、より直接的なアプローチを取ることができるはずです。上記の解決策が私のために働いているという事実のために、私はこれを自分で試していません。

于 2013-01-03T07:56:51.630 に答える
1

静的メソッドを使用して同じStringフォーマットを実現できます。String.format(String format, Object... args)

Log.d(TAG, String.format("Number is: %d", new Integer(42)));
于 2012-11-16T01:15:37.577 に答える
0

使用する:

android.util.Log.i(TAG,  "Number is: " + number);

http://developer.android.com/reference/android/util/Log.htmlを参照してください

于 2012-11-15T23:22:16.080 に答える