有哪些适用于j2me的日志记录解决方案?
我特别关注如何轻松地在“发布”版本中排除日志记录,以获得更小的软件包和更小的内存占用。
有哪些适用于j2me的日志记录解决方案?
我特别关注如何轻松地在“发布”版本中排除日志记录,以获得更小的软件包和更小的内存占用。
MicroLog是一个可靠的选择。它是用于Java ME(J2ME)的小型日志记录库,类似于Log4j。它支持将日志记录到控制台、文件、RecordStore、Canvas、Form、蓝牙、串口(蓝牙、红外线、USB)、Socket(包括SSL)、UDP、Syslog、MMS、SMS、电子邮件或Amazon S3。
如果您正在使用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
-assumenosideeffects public class logger.Logger {*;}
无需预处理。
我在一个生产应用中使用了MIDPLogger,并且取得了一定的效果,尽管我发现将其集成到应用程序中后它的用途更加广泛,而不是仅作为另一个Midlet套件之类的一部分。我也找到了MicroLog,但还没有进行深入的使用。
使用日志记录器类的条件编译不能解决完全移除日志语句的问题,因为您往往会记录比一个简单字符串更多的内容。您将查找变量值,然后将它们组装成字符串,例如:WhateverLog.log(“已加载”+ someclass.size()+“ foos”)。
现在,如果您仅留下WhateverLog.log的主体(如接受的解决方案中所示),则仍会留下大量不必要的代码,包括字符串连接(因此创建了一个StringBuffer)。这就是为什么最好使用像Proguard(已经提到)这样的字节码后处理工具。 Proguard的-assumenosideeffects将允许其优化器删除不仅是日志记录语句,还包括所有仅由日志调用使用结果的代码。
WhateverLog.log("Loaded %d foos", someclass.size());
。只有在启用日志记录时才执行格式化。如果可能的话,最好也避免进行额外的 size
调用。 - Matthew FlaschenJ2ME的LWUIT框架提供了记录表单(Logging form),可以在其中记录语句。您可以在任何可能引起异常的地方添加日志。
例如:Log.getInstance().showLog(); 通过添加上述行,您可以跟踪J2ME设备中的日志记录。