Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 登录J2ME_Logging_Java Me_Mobile_Mobile Phones - Fatal编程技术网

Logging 登录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、系统日志、彩信、短信

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


我特别感兴趣的是,轻松地排除“发布”版本的日志记录,以减少软件包和内存占用

我在生产应用程序中已经达到了某种可接受的水平,尽管我发现它在集成到应用程序中后比作为套件中的另一个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滚动我自己的,因为你正在访问旧的帖子