关于真机中的Android Logcat

GMs*_*soF 4 android logcat

我有一些与 Android Logcat 相关的问题,我指的是真实设备而不是模拟器中的这些问题:

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

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

  3. 每个应用程序都会将其日志输出到不同的日志文件吗?或者它们都转储到同一个日志文件中?这种情况下,我们该如何分离日志呢?

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

fad*_*den 5

逐点进行:

(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 不允许应用程序读取日志中的所有条目。相反,应用程序只能读取它们自己生成的条目。这样做是为了允许错误报告系统捕获日志,同时防止任性的应用程序“监视”其他应用程序。当您logcat从运行时adb shell,它以用户身份运行shell,该用户有权读取所有日志。

  • 对于 Jellybean (API 16) 及更高版本,这是正确的。对于早期版本,您将看到所有日志,但需要 READ_LOGS 权限才能访问它们。请参阅 https://groups.google.com/forum/?fromgroups=#!topic/android-developers/6U4A5irWang 中 hackbod 的帖子。 (2认同)