Android中logcat和日志打印-1-基础
一、logcat对日志过滤
1.# logcat --help
# logcat --help Usage: logcat [options] [filterspecs] options include: -s Set default filter to silent. Like specifying filterspec '*:s' -f <filename> Log to file. Default to stdout -r [<kbytes>] Rotate log every kbytes. (16 if unspecified). Requires -f -n <count> Sets max number of rotated logs to <count>, default 4 -v <format> Sets the log print format, where <format> is one of: brief process tag thread raw time threadtime long -c clear (flush) the entire log and exit -d dump the log and then exit (don't block) -t <count> print only the most recent <count> lines (implies -d) -t '<time>' print most recent lines since specified time (implies -d) -T <count> print only the most recent <count> lines (does not imply -d) -T '<time>' print most recent lines since specified time (not imply -d) count is pure numerical, time is 'MM-DD hh:mm:ss.mmm' -g get the size of the log's ring buffer and exit -b <buffer> Request alternate ring buffer, 'main', 'system', 'radio', 'events', 'crash' or 'all'. Multiple -b parameters are allowed and results are interleaved. The default is -b main -b system -b crash. -B output the log in binary. -S output statistics. -G <size> set size of log ring buffer, may suffix with K or M. -p print prune white and ~black list. Service is specified as UID, UID/PID or /PID. Weighed for quicker pruning if prefix with ~, otherwise weighed for longevity if unadorned. All other pruning activity is oldest first. Special case ~! represents an automatic quicker pruning for the noisiest UID as determined by the current statistics. -P '<list> ...' set prune white and ~black list, using same format as printed above. Must be quoted. filterspecs are a series of <tag>[:priority] where <tag> is a log component tag (or * for all) and priority is: V Verbose (优先级最低) D Debug I Info W Warn E Error F Fatal S Silent (supress all output) (最高优先级,不会打印任何内容) '*' means '*:d' and <tag> by itself means <tag>:v If not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS. If no filterspec is found, filter defaults to '*:I' If not specified with -v, format is set from ANDROID_PRINTF_LOG or defaults to "brief"
1. logcat命令位置:/system/bin/logcat
2.logcat的常用用法
# logcat -s <tag> 只看指定tag的log,还可以 logcat -s <tag1> -s <tag2> ... 过滤多个tag的log。
# logcat *:W 过滤日志则会将该级别及以上的日志输出
# logcat ActivityManager:I MyApp:D *:S 表示输出tag=“ActivityManager”的Info以上级别日志,输出tag=“MyApp”的Debug以上级别日志,及其它tag的Silent级别日志(即屏蔽其它 tag 日志)。
# logcat -d logcat应该是动态打印的,加-d后打印完log后退出,不阻塞
# logcat -t 20 只打印最近的20行log,-T也是类似的功能,但是打印完后不退出。
# logcat -f a.txt -f保存到文件中,不使用重定向符号的
# logcat | grep -i myapp 忽略大小写。
# logcat | grep --color=auto -i priv-app 匹配到的“priv-app”会显示出颜色
# logcat | grep --color=auto 1979 只打印出进程PID为1979的log
# logcat -c && logcat
# logcat -v time 打印时加上时间
# logcat -g 打印各个环形缓冲区的大小后退出
# logcat -S 打印出统计信息
# logcat | grep -E "Theft|u-blox" grep -E 正则表达式,可以一次性检索多个关键字
# logcat <tag1>:<priority1> <tag2>:<priority2> 过滤低优先级的日志
# logcat *:E 只查看错误打印
3.有 3 种方式使用 logcat 打印日志:
可以通过 IDE(比如 Android Studio)提供的 logcat 窗口查看打印的日志
可以通过 adb 命令使用 logcat 在本地计算机进行日志查看
通过 adb 命令进入模拟器或者所连设备的 shell 命令窗口,进行 logcat 的操作和使用
4.设置输出日志等级
通过设置优先级,过滤掉低优先级的日志,使用方式如: adb logcat <tag1>:<priority1> <tag2>:<priority2>
示例: logcat PowerManagerService:I PackageManager:I 表示logcat时不打印PowerManagerService和PackageManager的优先级低于Info的log
5.logcat选择打印的缓冲区:
# logcat -b <buffer> 可以指定要打印的环缓冲区,“main”,“system”,“radio”或“events”。 允许多个-b连用,这样打印的结果是交错的,默认为: -b main -b system -b crash。
radio - 查看缓冲区的相关的信息.
events - 查看和事件相关的的缓冲区.
main - 查看主要的日志缓冲区.
system - 与系统相关的日志信息.
6. logcat默认的几种输出格式为
格式:logcat -v threadtime
(1)brief格式为:<priority>/<tag>(<pid>): <message> eg: D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
(2)process格式为:<priority>(<pid>) <message> eg: D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
(3)tag格式为:<priority>/<tag>: <message> eg: D/HeadsetStateMachine: Disconnected process message: 10, size: 0
(4)raw格式为:<message> eg: Disconnected process message: 10, size: 0
(5)time格式为:<datetime> <priority>/<tag>(<pid>): <message> eg: 08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
(6)threadtime格式为:<datetime> <pid> <tid> <priority> <tag>: <message> eg: 08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
(7)long格式为:[ <datetime> <pid>:<tid> <priority>/<tag> ] <message> eg: [ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
二、日志打印函数
1.程序中使用 ALOGx(),SLOGx(),RLOGx()来分别打印 app,system,radio 的log, x表示下面6种打印级别:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
比如:
#define LOG_TAG "LedHal"
ALOGI("hal_led_ioctl called: which=%d, status=%d", which, status);
打印: I/LedHal ( 2284): hal_led_ioctl called: which=0, status=0 //打印等级/Tag (PID): message
三、日志统计
1.# logcat -b all -S 可以统计出各个log buffer中最健谈的log的进程、UID、TAG
# logcat -b all -S size/num main radio events system crash stats performance security kernel Total Total 4294940/52209 1224624/6903 386275/3669 1197331/12884 165/3 0/0 9132/180 0/0 0/0 7112467/75848 Now 261517/3561 257987/1383 252696/2824 246225/2728 165/3 9132/180 1027722/10679 Logspan 1:09:38.987(3.9%) 2:15:44.731(24.2%) 2:15:41.166(96.9%) 2:15:44.791(37%) 3:03.21 2:10:35.716 2:15:48.058 Overhead 460933 335435 410840 398993 333 19212 1775074 update time=0, report time=0, buffer rate = 0 Byte/sec, log rate = 0 sec-1 buffer chatty rate = 15000 Byte/sec, log chatty rate = 100 sec-1 最健谈的main log: Chattiest UIDs in main log buffer: Size +/- Pruned UID PACKAGE BYTES NUM 10061 com.android.systemui 51486 -14% 1256 1000 system 40438 -67% 3478 PID/UID COMMAND LINE " " 1612/1000 system_server 5384 2409 2972/1000 com.coloros.persist.system 2999 623 最健谈的main log: Chattiest UIDs in radio log buffer: Size +/- Pruned UID PACKAGE BYTES NUM 1001 radio 246546 -3.6% 5766 1000 system 11037 5.2X 最健谈的event log: Chattiest UIDs in events log buffer: Size +/- Pruned UID PACKAGE BYTES NUM 1000 system 231850 +4.3% 260 PID/UID COMMAND LINE " " 1612/1000 system_server 153760 14 最健谈的system log: Chattiest UIDs in system log buffer: Size +/- Pruned UID PACKAGE BYTES NUM 1000 system 180236 -20% 8572 PID/UID COMMAND LINE " " 1612/1000 system_server 69620 8238 2972/1000 com.coloros.persist.system 68819 324 最健谈的crash log: Chattiest UIDs in crash log buffer: Size UID PACKAGE BYTES 0 root 165 最健谈的performance log: Chattiest UIDs in performance log buffer: Size UID PACKAGE BYTES 1000 system 2909 PID/UID COMMAND LINE " 1612/1000 system_server 556 最健谈的PID: Chattiest PIDs: Size Pruned PID/UID COMMAND LINE BYTES NUM 2904/1001 com.android.phone 270946 5604 1612/1000 system_server 240357 10661 最健谈的TID: Chattiest TIDs: Size Pruned TID/UID COMM BYTES NUM 2904/1001 com.android.phone 217685 4117 1765/1000 android.bg 78212 147 最健谈的events log中的TAG: Chattiest events log buffer TAGs: Size Prune TAG/UID TAGNAME BYTES NUM 1003 auditd 89160 390 30047/1000 am_pss 73004 最健谈的TAG: Chattiest TAGs: Size TID/PID/UID LOG_TAG NAME BYTES 2904/1001 SST 121294 auditd 89160
四、补充
1. logcat 有时候要和grep配合使用,而后者是区分大小写的,grep -i 就不再区分大小写了。
2. 使用举例
#define LOG_TAG "LedHal" ALOGI("led_open: %d", fd); //c.打印出来的格式为: I/LedHal (1987): led_open: 65 //(级别)/LOG_TAG (进程号) 打印信息
logcat LedHal:I *:S 使用logcat的过滤规则,-h可以查看,为<tag>[:priority],第一种过滤规则:第二种过滤规则
logcat LedHal:I *:S 打印tag为LedHal的且优先级高于I的log,过滤掉的信息会流到下一个规则 *:S, *表示所有的tag,S表示这个信息不想被打印。此条命令作用:只打印tag为LedHal且优先级大于等于I的log.
logcat既可以在串口上执行,也可以使用adb远程执行。检索信息: logcat | grep LedHal
过滤规则可以有很多,但是其只有七层V D 到S,
posted on 2019-01-16 14:51 Hello-World3 阅读(6743) 评论(0) 编辑 收藏 举报