3

我有一些与 Android Logcat 相关的问题,我将这些问题称为 REAL DEVICE 而不是模拟器:

  1. 我有一个程序有很多Log.d(或其他类似的日志功能),我做了一些谷歌搜索,发现这些日志将输出到一个循环的 64K 缓冲区。我的问题是,那些 64K 缓冲区在哪里?它位于 RAM 或文件系统中吗?我的应用退出后会被删除吗?

  2. 我谷歌发现,日志将输出到一个名为/dev/event(不确定)的文件,但我看不到任何与应用程序相关的日志记录,为什么?只能看到与系统相关的日志条目。

  3. 每个应用程序是否将其日志输出到不同的日志文件?还是它们都转储到同一个日志文件中?在这种情况下,我们如何分离日志?

  4. 如果日志缓冲区是 64K,我们如何增加它?如果我们想将日志重定向到 sd 卡上的文件,我们如何限制文件大小(当然也让它循环)?

4

1 回答 1

4

逐点进行:

(1) 日志缓冲区在 RAM 中,在内核中。日志记录由内核驱动程序处理。在最近的设备上,日志缓冲区远大于 64KB。当应用程序退出时它们不会丢失,但不会在设备重新启动后继续存在。

(2) 设备条目位于 中/dev/log,例如/dev/log/main用于主日志、/dev/log/radio无线电日志和/dev/log/events事件日志。日志的存储格式通常比您在 logcat 中看到的更紧凑,因此直接使用类似的方式读取它们cat可能会造成混淆。

(3) 所有应用程序写入相同的日志设备。每条日志消息都标有日志编写器的进程 ID 和线程 ID,因此您可以通过这种方式将它们分开。(logcat -v threadtime将显示 pid、tid、时间戳和标签。)

(4) 您需要更改驱动程序中的值以更改日志的大小。同样,最近的设备具有更大的日志缓冲区,所以这可能不是那么有用。您可以使用 ; 将输出发送到文件logcat。如果你想做某种循环缓冲区,你需要捕获 logcat 的输出并自己处理。(您也可以直接读取日志设备,但我不认为 API 是公开的。请参阅 AOSP logcat 源。)

最新版本的 Android 不允许应用读取日志中的所有条目。相反,应用程序只能读取它们自己生成的条目。这样做是为了允许错误报告系统捕获日志,同时防止任性的应用程序“监视”其他应用程序。当您从 运行logcatadb shell,它以用户身份运行,该shell用户具有读取所有日志的权限。

于 2013-09-14T06:06:20.547 回答