Android的logcat日志工具使用详解

logcat是Android中一个命令行工具,可以用于得到程序的log信息。Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命令来查看和使用。

一、环境描述

宿主机OS:CentOS 6.6 x86_64
宿主机IP:192.168.1.119
虚拟机OS:Android-x86 4.4-r2
虚拟机IP:192.168.1.126
网络方式:Bridge
Android SDK版本:android-sdk_r24.2-linux
KVM版本:QEMU PC emulator version 0.12.1 (qemu-kvm-0.12.1.2-2.448.el6_6.3)

二、logcat命令的基本用法

1. logcat命令使用格式

  1. [adb] logcat [<option>] ... [<filter-spec>] ...

2. 两种使用方式

在宿主机上使用:

  1. $ adb logcat

在虚拟机或手机上使用:

  1. # logcat

三、过滤日志输出

每一条输出的Android日志信息都有一个标签和优先级。

1. 日志标签

日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就 是查看系统的标签)。

2. 日志优先级

日志优先级有下列几种,按照从低到高顺序排列:

  • V — Verbose(最详细的日志,最低优先级)
  • D — Debug(调试)
  • I — Info(信息)
  • W — Warning(警告)
  • E — Error(错误)
  • F — Fatal(致命错误)
  • S — Silent(静默,最高优先级,不会输出任何信息)

3. 日志过滤器

在运行logcat的时候在前两列的信息中你就可以看到 logcat 的标签列表和优先级别,它是这样标出的:<priority>/<tag>

下面是一个logcat输出的例子,它的优先级是I,标签是ActivityManage

  1. I/ActivityManager (585): Starting activity: Intent { action=android.intent.action...}

为了让日志输出能够体现管理的级别,你还可以用过滤器来控制日志输出,过滤器可以帮助你描述系统的标签等级。

过滤器语句按照下面的格式描述:

  1. tag:priority ...

其中,tag表示标签,priority表示相应标签日志的最低优先级。

从上面的tag的中可以得到日志的标签和优先级。你可以在过滤器中多次描述tag:priority

4. 使用实例

请查看以下使用实例:

  1. adb logcat ActivityManager:I MyApp:D *:S

上述实例表示支持所有的日志信息,除了标签为“ActivityManager”和优先级为“Info”以上的日志,以及标签为“MyApp”和优先级为“Debug”以上的日志。上述实例中的最后的元素*:S,意味着将所有其他标签的优先级设置为“Silent”,所有日志只显示有“ActivityManager”“MyApp”标签的。*:S的另一个用处是能够确保日志输出的时候是按照过滤器的说明限制的,也让过滤器作为一项输出到日志中。

下面的过滤语句只显示优先级为“Warning”或更高优先级的日志信息:

  1. adb logcat *:W

如果你在宿主机上运行logcat,相比起在远程adb shell端,你还可以为环境变量ANDROID_LOG_TAGS指定一个参数来设置默认的过滤器:

  1. export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"

注意,如果通过远程shell运行logcat命令,或者运行adb shell logcat命令,那么将不能使用ANDROID_LOG_TAGS中设置的过滤器。

四、指定日志输出格式

日志信息包括很多元数据域,例如标签和优先级。可以修改日志的输出格式,指定显示特定的元数据域。可以通过-v 选项得到格式化输出日志的相关信息:

  • brief — 显示源进程的优先级/标签和PID(默认格式)。
  • process — 只显示PID。
  • tag — 只显示优先级/标签。
  • thread — 只显示进程 : 线程和优先级/标签。
  • raw — 显示原始的日志消息,没有其他的元数据域。
  • time — 显示源进程的日期、调用时间、优先级/标签和PID。
  • long — 显示所有的元数据域和单独的消息,带有一个空行。

启动logcat时,你可以通过-v选项来指定日志输出格式:

  1. [adb] logcat [-v <format>]

以下实例使用thread来指定日志输出格式:

  1. adb logcat -v thread

注意,你只能使用-v选项来指定日志输出格式的选项。

五、查看可用的日志缓冲区

我们在使用logcat抓取日志的时候,可以指定buffer,来请求不同的环形缓冲区 (‘main’, ‘system’, ‘radio’, ‘events’,默认为”-b main -b system“),因为Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b选项,以下是可以指定的缓冲区:

  • radio — 查看包含在无线/电话相关的缓冲区消息。
  • events — 查看事件相关的日志消息。
  • main — 查看主缓冲区(默认缓冲区)。
  • system — 查看系统相关的日志消息。

-b选项的使用方法如下所示:

  1. [adb] logcat [-b <buffer>]

以下实例表示如何查看包含无线和电话的日志消息:

  1. adb logcat -b radio

六、查看标准输出和标准错误

在默认状态下,Android系统会将标准输出和标准错误(System.outSystem.err)输出到/dev/null,在运行Dalvik VM的进程中,有一个系统可以备份日志文件。在这种情况下,系统会用标准输出和标准错误,以及优先级 I 来记录日志消息。

通过以下方法可以指定日志输出的路径,停止运行的模拟器/设备,然后使用setprop命令远程输入日志:

  1. $ adb shell stop
  2. $ adb shell setprop log.redirect-stdio true
  3. $ adb shell start

七、logcat命令选项

选项 描述
-b <buffer> 请求可选择的环形缓冲区,main、system、radio或events。可以使用多个-b参数,输出的结果是交错的。默认值为-b main -b system。
-c 清除全部日志,然后退出。
-d 转储日志,然后退出(不会阻塞)。
-f <filename> 将日志输出至文件。默认为标准输出(stdout)。
-g 获取日志环形缓冲区的大小,然后退出。
-n <count> 通过指定轮转日志的最大数量,默认为4。
-r <kbytes> 每千字节就轮转一次日志。若没有指定,则默认值为16。需要使用-f选项。
-s “将默认的过滤器设置为静默。
就像是指定过滤器描述符“*:S”。
-v <format> “设置日志的输出格式,其中<format>是下面其中之一:
brief、process、tag、thread、raw、time、threadtime、long”
-t <count> 只输出最近几行的日志,行数由<count>指定(隐含-d选项)。
-B 以二进制方式输出日志。

八、在kvm环境中使用logcat

1. 启动Android-x86虚拟机

在virt-manager的图形界面中启动Android-x86虚拟机,如下图所示:

在shell中运行ps aux | grep kvm命令,可以看到这个虚拟机的进程详情,如下图所示:

2. 从宿主机连接至虚拟机

在shell中运行以下命令:

  1. adb connect 192.168.1.126

若命令返回如下图所示,则表示连接成功:

3. 运行logcat命令

在shell中运行以下命令:

  1. adb logcat

若命令返回和下图中类似,则表明已经看到Android虚拟机中的日志消息: