3

我在 Android 根目录中附加了 init.rc:

service logcat /system/bin/logcat -v long -f /mnt/sdcard/logcat.log

此解决方案不会生成任何日志。logcat.log 文件不存在。

如何开始通过 init.rc 收集 logcat 输出?

4

2 回答 2

5

有几件事可能会导致上述问题: 1. 您将服务定义为 logcat。这看起来非常接近可能是保留/预先存在的名称。我会选择一个更显赫的服务名称。2. 服务没有明确的启动触发器,因此它完全取决于其定义的上下文(即哪个初始化阶段)。选择错误的阶段(即太早)和 /mnt 甚至可能不存在。3. 该服务将默认以 root 身份运行,因此 logcat.log 文件将只能由 root 读写。以 root 身份运行进程并不好。并且为了阅读日志文件而强制读者是 root 也不好。

这是我用来实现您想要做的事情的方法。

问题:通常,Android 日志消息仅保留在内核的(易失性)内存中,因此无法在重新启动后继续存在。

解决方案:要在重新启动后保留这些日志消息,需要将它们写入持久存储(即文件系统)。下面的代码定义了这样一个由 Android 在初始化期间启动的服务。

第 1 步,定义一个服务,Android 初始化进程将生成该服务来执行此活动。这在 init.rc 中。

service persistentLogging /system/bin/logcat -r 1024 -n 9 -v threadTime -f /cache/logs/log
    user system
    group system log
    disabled

以上注意事项:

  1. 它通过启动触发器创建一个名为 persistentLogging 的服务(将在下面的第二步中提及)。
  2. 它请求 logcat 在目录 - /cache/logs(即 log、log.1、log.2、... log.9)中执行滚动日志文件(由 10 个文件/每个 1Mb 组成)。调整以适应您的需要。
  3. 该服务将以系统用户身份运行。这意味着日志文件将只能由系统读写。如果您的应用程序具有系统权限,那么您将能够读取日志文件。我也将服务定义在日志组中,因为这似乎是合适的,尽管因为文件不能按组读取,所以这是一个有争议的问题。
  4. 该服务最初被禁用。它将由下面定义的触发器启动
  5. 该服务不是一次性的。因此,如果它死了,Android 将尝试重新启动它。

第二步,定义启动服务的触发器。这也包含在您的 init.rc 文件中。

on post-fs
    mkdir /cache/logs 0775 system log
    start persistentLogging

以上注意事项:

  1. 这些命令是在“post-fs”阶段触发的,因此它们会在文件系统分区挂载后以及其他系统目录的权限发生更改时发生。理想情况下,该服务应该尽可能晚地启动,因为它不重要或被任何其他启动活动使用。
  2. 触发器在启动服务之前首先创建目标目录。记住 mkdir 命令语法是由 init.rc 语言定义的。在 Android 中,这个语法不是 sh 语法,尽管它看起来很像。
  3. 尽管上述日志服务直到 init 的 post-fs 阶段才启动,但它仍然会转储自内核启动开始以来的所有日志信息,因为这些日志消息已经在内核缓冲区中,并且此日志服务只是复制这些消息到一个文件。
  4. 尽管上述两个代码片段最终都需要出现在 init.rc 文件中,但如果将这些添加到为设备定义的 init.${ro.hardware}.rc 文件中,则更易于维护。例如 init.freescale.rc,它会自动包含在 init.rc 中。
于 2014-08-27T17:14:40.270 回答
-2
If we need to start the logcat and collect all the log buffers after on post-fs-data/boot completed from init.rc you can use below code in init.rc file.

on property:dev.bootcomplete=1
   start logging

on post-fs-data
   start logging

    service logging /system/bin/logcat -b all -v threadTime -f /data/directory_name/log -r 100000 -n 9
        user system
        group root system log
        disabled
于 2019-01-18T01:37:57.137 回答