J2ME登录

17

有哪些适用于j2me的日志记录解决方案?

我特别关注如何轻松地在“发布”版本中排除日志记录,以获得更小的软件包和更小的内存占用。

8个回答

20

MicroLog是一个可靠的选择。它是用于Java ME(J2ME)的小型日志记录库,类似于Log4j。它支持将日志记录到控制台、文件、RecordStore、Canvas、Form、蓝牙、串口(蓝牙、红外线、USB)、Socket(包括SSL)、UDP、Syslog、MMS、SMS、电子邮件或Amazon S3。

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


MicroLog看起来非常不错,但它需要CLDC 1.1。 - Casebash
1
我发现了一个叫做J4me的库,它可以在任何设备上运行。不过如果你能够管理的话,Microlog看起来更好。 - Casebash
实际上,对于我的需求来说,J4me看起来过于简单了(只提供日志记录级别)。我想我会使用Proguard自己编写。 - Casebash

13

如果您正在使用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;
  }
}

这样,终端开发人员可以启用他/她感兴趣的库内日志级别。如果没有启用任何日志级别,在最终产品混淆时所有日志记录代码都将被删除。太棒了:)

/JaanusSiim


第二个版本中,代码将如何被删除?您已经删除了预处理命令。 - Casebash
预处理部分位于应用程序代码中的“Log.setShowDebug(true)”周围。这样,“showDebug”将始终为false,并且ProGuard魔法将发生。您可能需要尝试不同的优化传递数量。 - JaanusSiim

8
您可以在Proguard中使用-assumenosideeffects来完全删除日志类:
-assumenosideeffects public class logger.Logger {*;}

无需预处理。


4
系列60和UIQ手机具有由Symbian自己修改的Sun虚拟机,支持标准输出重定向。
不仅可以捕获System.out,Throwable.printStackTrace()也可以使用。
在早期手机上,您需要编写一个C++应用程序,钩入标准库服务器进程。Symbian制作了Redirector应用程序,可以将VM标准输出捕获到控制台或文件中。
在更新的手机上,引入了“redirect://”GCF协议,可将VM标准输出读入Java byte []或String对象中(您需要在单独的MIDlet中进行),并且Redirector应用程序已重写为Java。
在Series60 3rd Edition Feature Pack 2手机及更高版本中使用的最新J9 VM上,您可能需要尝试“redirect://test”。

1

我在一个生产应用中使用了MIDPLogger,并且取得了一定的效果,尽管我发现将其集成到应用程序中后它的用途更加广泛,而不是仅作为另一个Midlet套件之类的一部分。我也找到了MicroLog,但还没有进行深入的使用。


0
我编写了一款字节码优化器,由于类文件的格式,您可以指向类名和函数的UTF编码,从而可以输出具有MyClass.someFunc()的日志(如果您想获取类型,可以处理签名),这使您可以像使用LINEFILE宏一样使用C风格调试。

0

使用日志记录器类的条件编译不能解决完全移除日志语句的问题,因为您往往会记录比一个简单字符串更多的内容。您将查找变量值,然后将它们组装成字符串,例如:WhateverLog.log(“已加载”+ someclass.size()+“ foos”)。

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


1
我必须表示不同意 :P正如所提到的 - 它只在使用proguard时起作用。在注释掉debug()方法的内容后,您将拥有一个空方法,该方法将被proguard删除。这意味着所有方法调用也将被删除 - 您将不会有任何无用的代码 ;) - JaanusSiim
许多日志库出于这个原因使用格式字符串。因此,调用将类似于 WhateverLog.log("Loaded %d foos", someclass.size());。只有在启用日志记录时才执行格式化。如果可能的话,最好也避免进行额外的 size 调用。 - Matthew Flaschen

0

J2ME的LWUIT框架提供了记录表单(Logging form),可以在其中记录语句。您可以在任何可能引起异常的地方添加日志。

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


很好,你正在访问旧的帖子。 - Lucifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接