0

在记录 RuntimeException 时,我对区分 System.err/out、e.printStackTrace 和日志感到有些困惑。

起初,我认为如果我使用 System.err/out、e.printStackTrace 并且只是在控制台上打印,日志信息不会保存在文件中。

但是 System.err/out、e.printStackTrace 似乎也被记录在了一个日志缓冲区中,我们可以通过 logcat 看到它。

因此,如果我们可以将 log 保存在一个文件中,也可以将 System.err/out 保存在一个文件中,则 e.printStackTrace 结果可以保存在一个文件中。

Q1。我的理解是对的吗?

Q2。如果是,哪种日志记录类型更适合在生产后调试现场问题?

Q3。如果发生任何 RuntimeExceptions,我在哪里可以找到 android 文件夹中的日志文件?

更新

我得到了 Q3 的答案。

对于 android,RuntimeException 日志似乎保存在 /data/system/dropbox 中。

4

2 回答 2

2

在 Android 中,使用Log. 在模拟器和大多数设备上,直接写入System.outSystem.err重定向到Log.i. 在某些设备上,写入System.out/err丢失。来自Android 文档

默认情况下,Android 系统将stdoutstderrSystem.outSystem.err)输出发送到/dev/null.

使用e.printStackTrace也只是写入到System.err,我相信它比Log方法提供的信息更少,因为您可以为后者添加一个日志标签。

据我所知,所有日志信息,包括应用程序崩溃的输出,都保存在日志中。(如果您捕获RuntimeExceptions,则除非您的代码生成它,否则没有输出。)我相信您可以在/system/bin/logcat;中找到日志。但是,它不是纯文本格式。您可以通过将信息附加到开发环境并输入命令,以可读的形式从设备中提取信息:

adb logcat -d -v time > logfile.txt

Eclipse 中还有一个 logcat 视图。还有一些免费实用程序(想到 aLogCatCatLog)用于查看设备上的 logcat 数据。

于 2013-08-29T02:33:06.840 回答
1

我的理解是对的吗?

你的理解似乎很好。大多数写入标准输出或错误的内容都显示在 Logcat 中。不过,正如 Ted Hopp 所指出的,最好使用Log该类进行日志记录。默认情况下,此信息不会保存到易于访问的文件中,但您可以自己执行该步骤。

如果是,哪种日志记录类型更适合在生产后调试现场问题?

如果您将调试信息存储在设备上的文件中,则很难收集调试信息。如果您将应用部署到 Google Play 商店,则可以使用开发者控制台查看应用的堆栈跟踪(前提是您的用户已选择发送崩溃报告)。一个更可靠的解决方案是使用一种服务,该服务可以跟踪野外崩溃并为您汇总许多有用的统计信息(例如,Crittercism)。

如果发生任何 RuntimeExceptions,我在哪里可以找到 android 文件夹中的日志文件?

据我所知,它们没有存储在日志文件中。您可以捕获每个异常并将某些内容写入自定义日志文件(您可以选择其位置),但这往往很笨拙;我上面提到的服务会更有效地做到这一点。

于 2013-08-29T02:40:55.187 回答