Android logcat分析

来源:互联网 发布:太平人寿内勤知乎 编辑:程序博客网 时间:2024/05/12 21:32
logcat是Android自带的一个查看log的命令,它从/dev/log/events、/dev/log/main、/dev/log/radio和/dev/log/system这些字符设备读取log信息,Android系统也会把log信息分为这四类分别保存在以上四种类型的字符设备中,这些字符设备使用一个环形buffer保存log信息,buffer大小都是256Kb。logcat的意义在于可以有效的管理log信息,选择最有效的log信息以便分析我们代码中存在的bug。
1. 默认读取/dev/log/main和/dev/log/system的信息
2. 默认把log信息输出到stdout
3. 默认从buffer的最开始位置读取
4. 默认输出所有应用的log,ANDROID_LOG_TAGS默认为空
5. 默认tag等级为V(所有等级信息都输出)
6. 默认输出格式为brief

用法:
$ logcat [options] [filterspecs]


选项分析:
-s:
不打印任何log信息,是一个特别的filterspecs,等价于:
$ logcat *:s
如果存在两个tag为‘*’时取priority最低的那个,例如以下命令,我们可以获得所有tag的priority为Info以上的信息
$ logcat -s *:i

-f:
把log信息重定向到文件,要保证以你当前登录的用户(默认为shell用户)对你指定的位置有读写的权限。
把tag的priority等级为D以及之后的log重定向输出到文件
$ chmod 777 /data/local/tmp
$ logcat "*:D" -f /data/local/tmp/debug.log
or:
$ chmod 777 /data/local/tmp
$ logcat "*:D" > /data/local/tmp/debug.log

-r:
这个选项需要结合(-f, -r两个选项使用),不指定大小默认为16Kb,读取环形缓冲区的最后xx Kb log信息输出到文件。
读取最后10Kb的log信息输出到文件
$ logcat -f /data/local/tmp/verbose.log -r 10

-n:
这个选项需要结合(-f -r两个选项使用),使用过程中如果不使用-r选项会自动添加这个选择,并且使用默认大小。关于这个logcat中并没有说明,不过可以直接看源码的实现好了(logcat.cpp +203)。
获取环形缓冲区10次更新的最后10Kb大小的log信息
$ logcat -f /data/local/tmp/rotate.log -r 10 -n 10

-v:
设置打印格式,默认的格式为“brief”,可选的格式如下,从源码(logprint.c)里面拿出来的,直接明了,具体打印格式大家可以自己试试。
if (strcmp(formatString, "brief") == 0) format = FORMAT_BRIEF;
else if (strcmp(formatString, "process") == 0) format = FORMAT_PROCESS;
else if (strcmp(formatString, "tag") == 0) format = FORMAT_TAG;
else if (strcmp(formatString, "thread") == 0) format = FORMAT_THREAD;
else if (strcmp(formatString, "raw") == 0) format = FORMAT_RAW;
else if (strcmp(formatString, "time") == 0) format = FORMAT_TIME;
else if (strcmp(formatString, "threadtime") == 0) format = FORMAT_THREADTIME;
else if (strcmp(formatString, "long") == 0) format = FORMAT_LONG;
else format = FORMAT_OFF;
设置打印格式为"time"
$ logcat -v time
or
直到退出前直接使用logcat都是以‘time’格式打印
$ export ANDROID_PRINTF_LOG=time && logcat

-c:
清除缓冲区的信息。
查看目前缓冲区的容量并清除,可以看到未清除之前是main的缓冲区已满,system的缓冲区使用了29Kb,清除后已使用的全部为0Kb。
$ logcat -g
/dev/log/main: ring buffer is 256Kb (255Kb consumed), max entry is 5120b, max payload is 4076b
/dev/log/system: ring buffer is 256Kb (29 Kb consumed), max entry is 5120b, max payload is 4076b
$ logcat -c
$ logcat -g
/dev/log/main: ring buffer is 256Kb (0Kb consumed), max entry is 5120b, max payload is 4076b
/dev/log/system: ring buffer is 256Kb (0Kb consumed), max entry is 5120b, max payload is 4076b

-d:
从去缓冲区中已缓冲的log信息全部输出并退出
$ logcat -d

-t:
从缓冲区开始位置读取xx行输出。
读取10行输出
$ logcat -t 10

-g:
查看缓冲区的使用情况。
$ logcat -g

-b:
默认读取的缓冲区只有main和system,可以通过-b指定多个要读取的缓冲区。
读取所有的缓冲区,只读取头1000行,且只输出priority为W之后的信息
$ logcat -b main -b system -b radio -b events *:w -t 1000

-B:
以二进制形式输出
$ logcat -B

filterspecs:
是一组特别的字符串,都是<tag>[:priority]这样的形式,tag就是我们希望过滤的tag,priority就是需要过滤的最低等级,可以有多个这样的串。这里tag和priority都是不区分大小写的。tag是可选的,priority不是可选的,如果不写会得到一个默认值,这个值通过源码可以知道为Debug。如果不设置filterspecs会读取环境变量ANDROID_LOG_TAGS的值作为filterspecs的输入值,这个环境变量的值默认也是空的,设置这个环境变量有利于我们长期需要设定同样的filterspecs。
priority有以下等级,最上的等级最低。
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent (supress all output)
按照时间格式打印log信息,并只选择所有tag的priority为Warn之后的信息,但是除了wifi例外(priority为Info),这里的打印方式和Eclipse中的logcat类似,但是却有更加灵活。
$ logcat -v time *:w wifi:i


小结:
1. logcat可以以函数的形式提供出去直接在代码中直接调用,方便调试,需要做的时就是功能模块化,把需要依赖的文件编译为静态库在使用的时候链接即可。
2. 谷歌写这个logcat也是蛮拼的,为了有效管理&&整合log信息便于调试做了很多的工作,代码都是模块化的,在很多地方可以借鉴。
3. 为什么我们在Java中需要调用log才能打印出信息呢,为在native方法中一定要使用android/log.h里面的打印才能在IDE和终端使用logcat看到打印信息呢?
    3.1 Eclipse使用logcat输出log信息。
    3.2 Android Studio也使用logcat输出log信息。
    3.3 如果我们使用printf打印信息,这些log信息都会输出到当前程序所在的终端,Android上跑的大部分不是二进制程序,导致没地方输出,这些信息也就看不到了。
    3.4 Android会把log信息按照类别分别写入(main、system、events、radio)四个字符设备,我们写的程序都的log信息都会被写入main字符设备中,这样方便管理这些log信息,可以很多程序都使用这些log信    息。
    3.5 logcat可以按照一定的方式筛选出有效的信息。
    3.6 以上四个字符设备相当于环形缓冲区,可以多个程序同时写入也可以多个程序同时读出,这样的设计是非常优秀的,所以我们在Eclipse和终端等地方都可以看到相同的log信息。
    //fix me


0 0
原创粉丝点击