log 分为 kernel , main, events ,radio 几种log
kernel属于 linux内核的log ,通过读取 /proc/kmsg 或者通过串口来抓取。
USB连接手机抓取方式:
adb shell cat /proc/kmsg > kernel.log
串口抓取方式:
在串口终端中设置对应的串口波特率,打开相应的串口。获取log。
main, events ,radio 是 framework的log ,包括cpp 和 java代码的log。
radio 可以抓ril层的log, 抓取方式:
adb logcat -b radio -v time > radio.txt
-v time 表示在log中加入每条log发生的时间。
main log 和我们从DDMS中看到的log是一致的。
抓取方式:
adb logcat -b main -v time > main.txt
event log 属于system log
抓取方式:
adb logcat -b events -v time > events.log
其实我们不知道,logcat -b的 选项是可以复用的!第一次发现这个,我是从logcat 实现的源码中发现的。
请看下面的show_help 函数中的 红色字体。 The default is -b main -b system ,意思是说,如果我们不加 -b 选项的话,默认就是 -b main -b system 两种log。
这样我们要抓 所有的 非内核的log 就变得比较方便的。那么我们只需要把所有的四种类型的log 都加进 -b 选项中。
那么我们就可以打印所有的log啦!如下命令即可实现:
adb logcat -b main -b system -b radio -b events -v time > all_user.log
并且,我们也可以对比 radio 和events 等各种类型的log,因为有个 时间标签,我们可以知道 不同类型的log之间的顺序。
这样子,我们就不用去开两个终端去分别抓取不同类型的log了。是不是很爽!?
#ls /dev/log/
events
ksystem
main
radio
system
事实上,我还发现了 /dev/log/ 目录下 另外还有一个很多资料当中没有提到过的 ksystem 的 设备节点。这个可能是用于获取其它信息的。目前我还没有去研究,这个设备节点是用来干什么的。如果有人知道,请告知。谢谢。
"system/core/include/cutils/logger.h"
#define LOGGER_LOG_MAIN "log/main"
#define LOGGER_LOG_RADIO "log/radio"
#define LOGGER_LOG_EVENTS "log/events"
#define LOGGER_LOG_SYSTEM "log/system"
"system/core/logcat/logcat.cpp"
static void show_help(const char *cmd)
{
fprintf(stderr,"Usage: %s [options] [filterspecs]\n", cmd);
fprintf(stderr, "options include:\n"
" -s Set default filter to silent.\n"
" Like specifying filterspec '*:s'\n"
" -f
" -r [
" -n
" -v
" brief process tag thread raw time threadtime long\n\n"
" -c clear (flush) the entire log and exit\n"
" -d dump the log and then exit (don't block)\n"
" -t
" -g get the size of the log's ring buffer and exit\n"
" -b
" or 'events'. Multiple -b parameters are allowed and the\n"
" results are interleaved. The default is -b main -b system.\n"
" -B output the log in binary");
fprintf(stderr,"\nfilterspecs are a series of \n"
"
"where
" V Verbose\n"
" D Debug\n"
" I Info\n"
" W Warn\n"
" E Error\n"
" F Fatal\n"
" S Silent (supress all output)\n"
"\n'*' means '*:d' and
"\nIf not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS.\n"
"If no filterspec is found, filter defaults to '*:I'\n"
"\nIf not specified with -v, format is set from ANDROID_PRINTF_LOG\n"
"or defaults to \"brief\"\n\n");
}