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.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 测试与我见过的其他日志格式代码一致。从理论上讲,您应该能够采取更直接的方法将类似的格式化程序安装到现有的处理程序中。由于上述解决方案对我有用,我自己没有尝试过。

于 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 回答