在init.rc中启用logcat

时间:2013-07-01 13:55:42

标签: android cyanogenmod

我在Android root中附加了init.rc:

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

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

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

2 个答案:

答案 0 :(得分:5)

可能导致以上问题的一些事情: 1.您将服务定义为logcat。这看起来非常接近可能是保留/预先存在的名称。我会选择一个更杰出的服务名称。 2.服务没有明确的启动触发器,因此它完全依赖于其定义的上下文(即哪个初始阶段)。选择错误的阶段(即太早)并且/ mnt甚至可能不存在。 3.默认情况下,服务将以root身份运行,因此logcat.log文件将仅由root用户运行。以root身份运行进程不好。并且不好强迫读者成为root用户才能读取日志文件。

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

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

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

步骤1,定义Android init进程将生成的服务以执行此活动。这是在init.rc中。

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

关于上述事项的说明:

  1. 它通过start触发器创建一个名为persistentLogging的服务(将在下面的第二步中引用)。
  2. 它要求logcat在目录 - / cache / logs(即log,log.1,log.2,... log.9)中执行滚动日志文件(由10个文件/ 1Mb组成)。根据您的需求进行调整。
  3. 该服务以系统用户身份运行。这意味着日志文件将仅由系统读取+写入。如果您的应用具有系统权限,那么您将能够读取日志文件。我也将服务定义在日志组中,因为这似乎是合适的,尽管由于文件不能被组读取,因此它没有实际意义。
  4. 该服务最初被禁用。它将由下面定义的触发器启动
  5. 服务不是单身。因此,如果它死了,Android将尝试重新启动它。
  6. 步骤2,定义启动服务的触发器。这也在你的init.rc文件中。

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

    关于上述事项的说明:

    1. 在'post-fs'阶段触发命令,以便在挂载文件系统分区之后以及其他系统目录的权限发生更改时发生。理想情况下,此服务应尽可能晚开始,因为它不重要或被任何其他启动活动使用。
    2. 触发器首先在启动服务之前创建目标目录。请记住,mkdir命令语法由init.rc语言定义。在Android中,这种语法不是sh语法,尽管看起来很像它。
    3. 虽然上面的日志记录服务直到init的fs后阶段都没有启动,但它会在内核启动开始后转储所有日志信息,因为这些日志消息已经在内核缓冲区中,而这个日志服务只是将这些消息复制到文件中。
    4. 虽然上面的两个代码片段最终都需要出现在init.rc文件中,但如果对设备定义的init。$ {ro.hardware} .rc文件进行了这些添加,则更易于维护。例如init.freescale.rc,由init.rc自动包含。

答案 1 :(得分:-1)

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