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
Android 同时将日志输出到文件和系统日志_Android_Logging - Fatal编程技术网

Android 同时将日志输出到文件和系统日志

Android 同时将日志输出到文件和系统日志,android,logging,Android,Logging,我正在尝试诊断我编写的应用程序中的问题。这个问题是零星的,只发生在现实世界的条件下:在这个领域中,远离我的PC,当我处于其他的中间时,没有任何资源可供立即调试。因此,我的最佳选择是收集和分析日志数据 不幸的是,当我意识到问题再次出现并开始调试它时,所有日志数据都已经从Android日志中转出,因为我经常同时运行其他聊天应用程序。增加日志缓冲区的大小并没有起到任何作用(要么Android不支持它,要么其他应用程序仍然太过健谈),所以我放弃了这条路线 出于这个原因,我现在正在考虑将我的应用程序日志放

我正在尝试诊断我编写的应用程序中的问题。这个问题是零星的,只发生在现实世界的条件下:在这个领域中,远离我的PC,当我处于其他的中间时,没有任何资源可供立即调试。因此,我的最佳选择是收集和分析日志数据

不幸的是,当我意识到问题再次出现并开始调试它时,所有日志数据都已经从Android日志中转出,因为我经常同时运行其他聊天应用程序。增加日志缓冲区的大小并没有起到任何作用(要么Android不支持它,要么其他应用程序仍然太过健谈),所以我放弃了这条路线

出于这个原因,我现在正在考虑将我的应用程序日志放在常规日志之外的一个单独的文本文件中

现在我可以很容易地把每一个电话都加倍

Log.i(TAG, "something happened");
添加另一个调用,将相同的内容写入日志文件,但这对我来说似乎不是很优雅

另一种选择是用一个将事件写入Android日志和日志文件的包装器替换对
Log
的所有调用

问:Android API是否为此提供了内置机制,即告诉
Log
同时将其数据写入默认日志和文本文件?还是我需要自己编写代码

编辑:

假设:

  • 我知道在我的代码中我需要在哪里生成日志输出(可以在任何地方发生,可能涉及也可能不涉及异常),以及我希望写入日志的内容
  • 从设备获取日志数据到我的电脑也不重要(单人秀,我只需将手机插入电脑并传输日志文件)

如果你知道当前的Android API没有内置机制来实现我想要的,那么“不,Android不支持这个”是一个完全可以接受的答案。在这种情况下,解决方案是明确的——我将回到包装器函数。我并不是在寻找解决问题的不同方法。

您没有指定是否引发了某些异常,但您没有处理。 在这种情况下,请看以下答案:

如果您必须查看一组变量和对象,我建议两种选择:

  • 将日志的副本写入文件。当您的问题发生时,请用户将文件发送给您。这在有自我意识的用户进行测试时非常理想
  • 获取有关使用情况的统计信息,就像商业软件一样。只需记录用户操作并将数据发送到服务器(这需要一个)。这是进行远程日志记录的最透明的方法

在将日志写入文件的情况下,您可以在内部内存(在应用程序的沙箱中)或外部内存(在这种情况下,如果您的目标是Android 6及以上版本,则需要写入权限,并且必须在运行时授予显式权限)中读取和写入您想要的内容。

经过进一步研究,安卓API似乎没有提供标准的方法来实现这一点。有两种可能的解决办法:

源位置的镜像输出
  • System.out
    System.err
    输出写入桌面系统中的控制台,并写入Android上的日志。这两个可以重定向到您选择的任何
    PrintStream
    ,这将为您提供所有Java控制台输出。您可以将
    PrintStream
    子类化以复制其输入,将其输入到默认流以及您选择的文件中
  • 创建一个类,该类公开与
    android.util.Log
    相同的方法。在每个方法中,调用相应的
    android.util.Log
    方法,并将数据另外记录到一个文件中。如果调用类
    Log
    (但使用不同的包名,例如
    org.example.Log
    ),则只需将
    android.util.Log
    的导入替换为类的导入,任何
    Log
    方法调用都将转到类中
注意事项:这将只提供代码明确记录的数据(即,您拥有源文件的数据),以及进入
System.out
System.err
的任何内容。它将不包括来自JAR库的日志输出(如果您无法修改它们的源代码),也不包括由系统(例如来自默认异常处理程序的堆栈跟踪)或其他进程(其中一些可能是与您的进程相关的系统进程和报告条件)生成的任何输出

从命令行读取日志 解释如何从Android中读取日志。简言之:

  • Android在设备上包括一个名为
    logcat
    的命令行实用程序,它将为您提供连续的日志消息,直到停止。(通过
    adb shell
    ing进入您的设备并运行它来尝试。它有一系列命令行选项来控制其行为。但不确定它是否存在于所有发行版中。)
  • 通过
    Runtime.getRuntime().exec(“logcat”)
    启动此命令,然后获取返回的进程的输入流。这将为您提供日志消息的输入流
  • 根据这篇文章,你的应用程序需要android.permission.READ_LOGS权限才能读取日志
我读过一些声明,说Android的某些版本(提到了4.2)不允许将此权限授予非系统应用程序。根据我自己的测试,没有此权限的行为有所不同:Anbox将返回完整的logcat,而天堂OS(在15.1上测试)将只显示调用它的应用程序的日志条目(包括以前的实例,可能与同一Linux用户相关的所有内容)。这可能是一个限制或欢迎过滤器功能。YMMV

logcat
方便地有一个命令行选项,
-f
,用于指定
Runtime.getRuntime().exec("logcat -f " + absolutePathToLogFile);