Logging 登录J2ME
j2me有哪些日志记录解决方案Logging 登录J2ME,logging,java-me,mobile,mobile-phones,Logging,Java Me,Mobile,Mobile Phones,j2me有哪些日志记录解决方案 我特别感兴趣的是,轻松地排除“发布”版本的日志记录,以减少软件包和内存占用 我在生产应用程序中已经达到了某种可接受的水平,尽管我发现它在集成到应用程序中后比作为套件中的另一个Midlet等有更多的用途。我也找到了,但还没有用到任何细节。MicroLog肯定是不错的选择。它是一个类似Log4j的Java ME(J2ME)的小型日志库。它支持登录到控制台、文件、记录库、画布、表单、蓝牙、串行端口(蓝牙、红外、USB)、套接字(包括SSL)、UDP、系统日志、彩信、短信
我特别感兴趣的是,轻松地排除“发布”版本的日志记录,以减少软件包和内存占用 我在生产应用程序中已经达到了某种可接受的水平,尽管我发现它在集成到应用程序中后比作为套件中的另一个Midlet等有更多的用途。我也找到了,但还没有用到任何细节。MicroLog肯定是不错的选择。它是一个类似Log4j的Java ME(J2ME)的小型日志库。它支持登录到控制台、文件、记录库、画布、表单、蓝牙、串行端口(蓝牙、红外、USB)、套接字(包括SSL)、UDP、系统日志、彩信、短信、电子邮件或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;
}
}
这样,最终开发人员可以在他/她感兴趣的库中启用日志级别。如果未启用任何功能,则在最终产品混淆中将删除所有日志代码。甜心:)
/Jaanussim系列60和UIQ手机的Sun虚拟机由Symbian自己修改,具有标准的输出重定向功能 不仅可以捕获System.out,而且Throwable.printStackTrace()也可以工作 在早期的手机上,你需要编写一个C++应用程序来钩住标准库服务器进程。Symbian开发了重定向程序应用程序,可以将VM标准输出捕获到控制台或文件中 在较新的手机上,引入了“redirect://”GCF协议,该协议可以将VM标准输出读入Java byte[]或String对象(您可能希望在单独的MIDlet中执行该操作),重定向程序应用程序用Java重写
在60系列第3版Feature Pack 2(及更高版本)中使用的最新J9 VM上,您可能需要尝试“redirect://test“相反。您可以使用proguard中的-AssumenosideEffects完全删除日志类:
-assumenosideeffects public class logger.Logger {*;}
不必进行预处理。我编写了一个字节码优化器,由于类文件的格式,您可以指向classname&function的UTF编码,它允许您使用MyClass.someFunc()输出日志(如果您想获得类型,可以处理签名)它允许您使用行和文件宏执行类似于C风格的调试。使用logger类的条件编译并不能解决完全删除日志语句的问题,因为您通常会记录的不仅仅是一个简单的字符串。您将查找变量值,然后将它们组合成字符串,例如:WhateverLog.log(“Loaded”+someclass.size()+“foos”)
现在,如果只保留WhateverLog.log的主体(如已接受的解决方案中所示),仍然会保留大量不必要的代码,包括字符串连接(从而创建StringBuffer)。这就是为什么您最好使用一个字节码后处理工具,如proguard(已经提到)。Proguard的-assumenosideeffects将允许其优化器不仅删除日志记录语句,而且删除其结果仅由日志记录调用使用的所有代码。J2ME的LUIT框架提供了日志记录表单,其中可以包含日志记录语句。您可以在您认为可能生成异常的每个位置添加日志 示例:Log.getInstance().showLog();
通过添加上面的行,您可以跟踪J2ME设备中的日志记录。我不同意:p正如前面提到的,它只有在使用proguard时才起作用。在注释掉debug()方法的内容之后,您将拥有一个空方法,该方法将由proguard删除。这将意味着所有方法调用也将被删除-您将不会有任何无用的代码;)出于这个原因,许多日志库使用格式字符串。因此,调用类似于
WhateverLog.log(“Loaded%d foos”,someclass.size())代码>。仅当启用日志记录时,才会进行格式化。理想情况下,如果可能的话,您还可以避免执行额外的size
调用。在第二个版本中如何删除代码?您已删除预处理命令预处理部分位于“Log.setShowDebug(true)”周围的应用程序代码中。这样“showDebug”将永远是错误的,ProGuard魔术将发生。你可能需要使用优化通行证号码。MicroLog看起来很不错,但它需要CLDC 1.1。我发现了一个名为的库,可以在任何设备上运行。如果你能管理它,Microlog看起来会更好。事实上,J4me对于我的需求来说太简单了(只提供了真正的日志级别)。我想我会用ProguardGood滚动我自己的,因为你正在访问旧的帖子