Nexus 5, Android 6.0.1, API 23
Log
类,相信开发 Android 的同学都不陌生,正如其名,Log
类提供了打印日志功能,方便我们在开发调试过程中输出调试信息,输出如下:
有大神觉得这样的输出信息不够多,不够美观,不够强大,于是就有了 logger、hugo、timber等 log 工具类。
虽然有这些强大的工具来使用,但是你离开了 IDE 还会看 log 吗?下面我们来介绍 adb logcat
的使用。
adb logcat
adb
全名叫做Android Debug Bridge
,也就是 Android 调试桥。是 Android SDK 提供的一个 DEBUG 工具,在 platform-tools
目录下。
logcat
是Android系统提供的一个命令行工具,用于输出 log 日志。
adb
和logcat
就组成了远程调试输出 log 的工具。��
把 SDK 的platform-tools
配置到了环境变量当中,在任意位置都可以调用adb
指令,当然也可以每次都进入到目录下进行调用…
调用logcat
指令有两种方式,一种是前面说的,直接adb logcat
,另一种是adb shell
进入手机的 shell 面板,然后在调用logcat
。下面我都会使用adb logcat
这种方式进行演示。
语法格式
logcat
的语法格式
logcat [options] [filterspecs]
命令参数
参数 | 描述 |
---|---|
-s | 设置过滤器 |
-v format | 设置日志打印格式 |
-f filename | 日志输出到指定文件 |
-r kbytes | 每 kbytes 输出日志,与-f一起使用 |
-n count | 设置日志最大数目 |
-b buffer | 加载日志缓冲区 |
-D | 在不同的缓冲区日志之间添加分割线 |
-c | 清除缓冲区并退出 |
-d | 打印缓冲区的log,并退出 |
-g | 打印环形缓冲区大小 |
-G size | 设置环形缓冲区大小 |
-t count | 打印最近 count 行日志,包含 -d 命令 |
-t time | 打印最近从 time 开始的日志,包含 -d 命令,时间格式 MM-DD hh:mm:ss.mmm |
-T count | 打印最近 count 行日志,不包含 -d 命令 |
-T time | 打印最近从 time 开始的日志,不包含 -d 命令,时间格式 MM-DD hh:mm:ss.mmm |
-L | 打印上次启动之前的日志 |
-B | 输出二进制日志 |
-S | 输出统计 |
-P list. | 设置 log 黑白名单 |
-p | 获取 log 黑白名单 |
-s
设置默认过滤器。
adb logcat -s <tag>[:priority]
tag
:对应 log 的 tag。值*
代表全部,如果只有*
,等于*:D
,如果仅有<tag>
,等于<tag>:V
。
priority
:优先级,从低到高分别是V,D,I,W,E,F,S。V,全部输出。S,全部输出。
例1,只输出 tag 为 test 的 log:
adb logcat -s test
#或者
adb logcat -s test:V
例2,只输出优先级大于 W 的日志:
adb logcat -s *:W
例3,输出 tag 为 test 的 E 级别 和 tag 为 test1 的 W 级别日志:
adb logcat -s test:E test1:W
-v
设置日志打印格式。
adb logcat -v <format>
format 共有 brief、color、long、printable、process、raw、tag、thread、threadtime、time、usec 格式,默认 threadtime。
各种输出格式如下:
#Java 代码
#private final static String TAG_0 = "sth0";
#Log.v(TAG_0, "0 Send a verbose log message");
#命令
# adb logcat -v <format> -s sth0:W
#brief
W/sth0 ( 1065): 0 Send a warn log message
#color 其实在 Terminal 里面是有颜色的
08-02 09:38:42.094 1065 1065 W sth0 : 0 Send a warn log message
#long
[ 08-02 09:38:42.094 1065: 1065 W/sth0 ]
0 Send a warn log message
#printable
08-02 09:38:42.094 1065 1065 W sth0 : 0 Send a warn log message
#process
W( 1065) 0 Send a warn log message (sth0)
#raw
0 Send a warn log message
#tag
W/sth0 : 0 Send a warn log message
#thread
W( 1065: 1065) 0 Send a warn log message
#threadtime
08-02 09:38:42.094 1065 1065 W sth0 : 0 Send a warn log message
#time
08-02 09:38:42.094 W/sth0 ( 1065): 0 Send a warn log message
#usec
08-02 09:38:42.094771 1065 1065 W sth0 : 0 Send a warn log message
-f
输出log到指定文件。<filename>
是手机内的文件,并不是调试用的电脑。
adb logcat -f <filename>
-r
设置每<kbytes>
时输出日志,需要和-f
一起使用。
adb logcat -f <filenam> -r <kbytes>
-n
设置日志每次最大输出<count>
行,需要和-f
一起使用。
adb logcat -f <filenam> -n <count>
-b
加载日志缓冲区,<buffer>
的值有main
,system
,radio
,events
,crash
,all
。默认main
,system
,crash
。
adb logcat -b <buffer>
例,加载radio
,events
:
adb logcat -b radio -b events
-D
在不同的缓冲区日志之间添加分割线。
adb logcat -D
-c
清除缓冲区日志,并退出。
adb logcat -c
-d
打印缓冲区日志,并退出。
adb logcat -d
-g
打印缓冲区大小。
adb logcat -g
-G
设置缓冲区大小。<size>
,以K
结尾,单位 kb,以M
结尾,单位 MB。
adb logcat -G <size>
例:
adb logcat -G 100K
-t
包含 -d
功能,也就是打印后退出。
打印最近<size>
行日志。
打印从'<time>'
时间开始的日志。时间格式MM-DD hh:mm:ss.mmm
。
adb logcat -t <size>
adb logcat -t '<time>'
例1,打印最近1000行日志,并且过滤出 tag 为 sth0 的日志:
adb logcat -t 1000 -s sth0:V
例2,打印 08-02 17:51:20.145 开始的日志
adb logcat -t '08-02 17:51:20.145'
-T
不包含 -d
功能,也就是打印后不退出,会持续输出。
打印最近<size>
行日志。
打印从'<time>'
时间开始的日志。时间格式MM-DD hh:mm:ss.mmm
。
adb logcat -T <size>
adb logcat -T '<time>'
例1,打印最近1000行日志,并且过滤出 tag 为 sth0 的日志:
adb logcat -T 1000 -s sth0:V
例2,打印 08-02 17:51:20.145 开始的日志
adb logcat -T '08-02 17:51:20.145'
-L
打印最后一次重启之前的日志。
adb logcat -L
-B
输出日志的二进制格式。
adb logcat -B
-S
输出统计信息。
adb logcat -S
-P
设置黑白名单。可以对 UID
,PID
设置,也可以UID/PID
一起设置。设置黑名单,前缀~
。
adb logcat -P '<list>...'
例1,对UID
520881设置。
adb logcat - P '520881'
例2,对PID
520881 设置黑名单。
adb logcat -P '~/520881'
例3,对UID
520881,对PID
78883,对 UID/PID
52189/8883 设置黑名单。
adb logcat -P `~520881 ~/78883 ~52189/8883'
-p
查看黑白名单。
adb logcat -p
进阶
利用 shell 重定向输出日志到指定文件。
#输出sth0:V到桌面1.log文件
adb logcat -s sth0:V >~/Desktop/1.log
利用 grep
过滤日志。
# 过滤日志包含 verbose 的日志
adb logcat | grep verbose
# 过滤日志包含 verbose 的日志,忽略大小写
adb logcat | grep -i verbose
# 过滤符合正则表达式 sth. 的日志
adb logcat | grep -e sth.