日志打印
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。
获取Android 日志
查看 Android 设备系统属性的基本命令格式是:
代码语言:javascript复制adb logcat [option] [filter-specs]
- 1
如果需要停止 logcat 日志打印,可以按 Ctrl C 停止日志监控。
按级别过滤日志
按级别过滤日志的基本命令格式是:
代码语言:javascript复制adb logcat [filter-specs]
- 1
Android 的日志分为如下几个优先级(priority):
级别 含义
*:V 过滤只显示 Verbose 及以上级别(优先级最低)
*:D 过滤只显示 Debug 及以上级别
*:I 过滤只显示 Info 及以上级别
*:W 过滤只显示 Warning 及以上级别
*:E 过滤只显示 Error 及以上级别
*:F 过滤只显示 Fatal 及以上级别
*:S 过滤只显示 Silent 及以上级别(优先级最高,什么也不输出)
按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:
代码语言:javascript复制adb logcat *:W
会将 Warning、Error、Fatal 和 Silent 日志输出。
(注:在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W",不然会报错 no matches found: *:W。)
按 tag 和级别过滤日志
按 tag 和级别过滤日志的基本命令格式是:
代码语言:javascript复制adb logcat [tag:level] [tag:level] ...
比如,命令:
代码语言:javascript复制adb logcat ActivityManager:I App:D *:S
表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag App 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
将日志格式化输出
可以用 adb logcat -v <format>
选项指定日志输出格式。
日志支持按以下几种 <format>
:
参数 显示格式
brief 显示格式:<priority>/<tag>(<pid>): <message>
process 显示格式:<priority>(<pid>) <message>
tag 显示格式:<priority>/<tag>: <message>
raw 显示格式:<message>
time 显示格式: <datetime> <priority>/<tag>(<pid>): <message>
threadtime 显示格式: <datetime> <pid> <tid> <priority> <tag>: <message>
long 显示格式: [ <datetime> <pid>:<tid> <priority>/<tag> ] <message>
日志格式默认为 brief,指定格式可与上面的过滤同时使用。比如:
代码语言:javascript复制adb logcat -v long ActivityManager:I *:S
清空已存在的日志
代码语言:javascript复制adb logcat -c
将日志显示在控制台
代码语言:javascript复制adb logcat -d
将日志输出到文件
代码语言:javascript复制adb logcat > log.txt
加载一个可使用的日志缓冲区供查看
代码语言:javascript复制adb logcat -b <Buffer>
Android log 输出量巨大,特别是通信系统的log,因此,Android把log输出到不同的缓冲区中,目前定义了四个log缓冲区:
Radio 输出通信系统的 log
System 输出系统组件的 log
Event 输出 event 模块的 log
Main 所有 java 层的 log 以及不属于上面3层的 log
缓冲区主要给系统组件使用,一般的应用不需要关心,应用的log都输出到main缓冲区中。默认log输出(不指定缓冲区的情况下)是输出System和Main缓冲区的log。
打印指定日志缓冲区的大小
代码语言:javascript复制adb logcat -g
内核日志
代码语言:javascript复制adb shell dmesg
在测试中,很多时候,对于log的需求还是比较多的,因此熟练掌握日志的使用,十分有必要。