17

j2me 有哪些日志记录解决方案?

我特别感兴趣的是轻松排除“发布”版本的日志记录,以获得更小的包和内存占用。

4

8 回答 8

19

MicroLog 是肯定的。它是一个用于 Java ME (J2ME) 的小型日志库,例如 Log4j。它支持记录到控制台、文件、RecordStore、Canvas、Form、蓝牙、串行端口(蓝牙、IR、USB)、套接字(包括 SSL)、UDP、Syslog、MMS、SMS、电子邮件或 Amazon S3 .

http://sourceforge.net/projects/microlog/

于 2008-09-23T13:18:03.607 回答
12

如果您使用 Proguard 进行预处理和混淆,那么您可以拥有一个简单的日志记录类。

public class Log {
  public static void debug(final String message) {
    //#if !release.build
    System.out.println(message);
    //#endif
  }
}

或者在需要的地方进行记录。现在,如果 release.build 属性设置为 true,此代码将被注释掉,这将导致一个空方法。Proguard 将删除空方法的所有用法 - 实际上发布版本将删除所有调试消息。

编辑:

在库级别考虑它(我正在研究映射 J2ME 库),我可能已经找到了一个更好的解决方案。

public class Log {
  private static boolean showDebug;

  public static void debug(final String message) {
    if (showDebug) {
      System.out.println(message);
    }
  }

  public static void setShowDebug(final boolean show) {
    showDebug = show;
  }
}

这样,最终开发人员可以在他/她感兴趣的库中启用日志级别。如果不启用任何内容,则在最终产品混淆中将删除所有日志记录代码。甜的 :)

/亚努斯西姆

于 2008-09-23T13:42:26.107 回答
7

您可以使用 proguard 中的 -assumenosideaffects 来完全删除您的日志记录类:

-assumenosideeffects public class logger.Logger {*;}

而不是必须预处理。

于 2008-10-03T09:59:11.247 回答
3

带有由 Symbian 自身修改的 Sun 虚拟机的 Series60 和 UIQ 手机具有标准输出重定向。

您不仅可以捕获 System.out,而且 Throwable.printStackTrace() 也可以。

在早期的手机上,您需要编写一个与标准库服务器进程挂钩的 C++ 应用程序。Symbian 开发了 Redirector 应用程序,可以将 VM 标准输出捕获到控制台或文件中。

在较新的手机上,引入了“redirect://”GCF 协议,该协议可以将 VM 标准输出读入 Java byte[] 或 String 对象(您可能希望在单独的 MIDlet 中执行此操作),并且 Redirector 应用程序被重写为爪哇。

在 Series60 3rd Edition Feature Pack 2 手机(及更高版本)中使用的最新 J9 VM 上,您可能需要尝试“redirect://test”。

于 2008-09-24T12:07:30.007 回答
1

我已经在生产应用程序中将 MIDPLogger使用到了可接受的水平,尽管我发现它在集成到应用程序中而不是作为套件中的另一个 Midlet 等之后有更多用处。我还找到了MicroLog,但没有将它用于任何细节。

于 2008-09-23T12:48:17.470 回答
0

我写了一个字节码优化器,由于类文件的格式,您可以指向类名和函数的 UTF 编码,它允许您使用 MyClass.someFunc() 输出日志(如果您想获取类型,可以处理签名),它允许您使用LINEFILE宏执行类似 C 风格的调试。

于 2008-10-14T18:27:33.473 回答
0

使用记录器类的条件编译并不能解决完全删除记录语句的问题,因为您通常会记录比简单字符串更多的内容。您将查找变量值,然后将它们组合成字符串,例如:WhateverLog.log("Loaded" + someclass.size() +"foos")。

现在,如果您只省略 WhatLog.log 的主体(如已接受的解决方案中所示),您仍然会留下许多不必要的代码,包括字符串连接(以及因此创建 StringBuffer)。这就是为什么你最好使用像 proguard 这样的字节码后处理工具(已经提到过)。Proguard 的 -assumenosideeffects 将允许其优化器不仅删除日志记录语句,还删除其结果仅由日志记录调用使用的所有代码。

于 2008-11-08T14:31:20.730 回答
0

J2ME 的 LWUIT 框架提供了 Logging 表单,可以在里面记录语句。您可以在您认为可能产生异常的每个地方添加日志。

示例:Log.getInstance().showLog(); 通过添加以上行,您可以跟踪 J2ME 设备中的日志记录。

于 2012-04-09T06:04:54.373 回答