转自:http://hi.baidu.com/xiaor186/item/01f3e6d0825920e6b3f777ef
view plaincopy to clipboardprint?
package com.borqs.logcat;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class Logcat extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("Logcat", "Verbose");
Log.d("Logcat", "Debug");
Log.i("Logcat", "Info");
Log.w("Logcat", "Warn");
Log.e("Logcat", "Error");
}
}
当我们打开模拟器使用#adb shell命令进入设备,然后使用logcat命令时,会出现像下面一样大量的log信息,
view plaincopy to clipboardprint?
D/skia ( 875): purging 200K from font cache [23 entries]
I/ActivityManager( 812): Starting activity: Intent { action=android.intent.action.MAIN flags=0x10200000 comp={com.borqs.logcat/com.borqs.logcat.Logcat} }
V/WindowManager( 812): before computeNewConfigurationLocked(mTempConfiguration)
V/Logcat ( 1821): Verbose
D/Logcat ( 1821): Debug
I/Logcat ( 1821): Info
W/Logcat ( 1821): Warn
E/Logcat ( 1821): Error
D/BorqsIME( 896): onStartInput ccontentType: 0 Restarting:false
I/ActivityManager( 812): Displayed activity com.borqs.logcat/.Logcat: 285 ms
D/dalvikvm( 812): GC freed 14185 objects / 618376 bytes in 209ms
而由我们所开发的应用Logcat发出的log信息:
view plaincopy to clipboardprint?
V/Logcat ( 1372): Verbose
D/Logcat ( 1372): Debug
I/Logcat ( 1372): Info
W/Logcat ( 1372): Warn
E/Logcat ( 1372): Error
就被掩埋其中。
那么,如何才能更好的利用logcat这个工具来为我们服务呢?
首先,我们要来学习一下“-b”指令
-b指令的作用是指定打开不同的log buffer。我们常用的log buffer一共有三个。
第一个就是上文我们看到的logcat默认buffer-main buffer. Main buffer中提供设备运行的主要log信息。
第二个是radio buffer,radio buffer中提供的是无线电和电话相关信息。
如下所示,即是打开”logcat”应用时的radio buffer中的内容:
view plaincopy to clipboardprint?
I/RILC ( 644): AT[0]< +ECSQ: 21,0
I/RILC ( 644): Rild monitor RIL_onUnsolicitedResponse come in
I/RILC ( 644): DEBUG: unsolResponseIndex is 9, and unsolResponseIndexEx is 9
I/RILC ( 644): Rild monitor RIL_onUnsolicitedResponse leave
第三个是 events buffer, events buffer 中提供的是事件相关信息:
如下所示,即是打开“logcat”应用时的events buffer中的内容:
view plaincopy to clipboardprint?
I/dvm_gc_madvise_info( 870): [610304,299008]
I/force_gc( 1372): bg
I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]
I/am_create_task( 804): 23
当我们对不同的模块进行调试时,我们就要从三个不同buffer中提取对自己有用的信息。
接下来我们再来学习“-c”命令
-c命令的作用就是清除已有log信息,当我们查看log信息时,为了减少无用log信息的干扰,我们需要将以前的log信息清除掉,只记录后续动作的log信息。
如下所示:
view plaincopy to clipboardprint?
I/dvm_gc_madvise_info( 870): [610304,299008]
I/force_gc( 1372): bg
I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]
I/am_create_task( 804): 23
# logcat -cb events
# logcat -b events
此时,我们可以看到,logcat信息已经为空了。
接下来,我们再来学习“-d”命令
-d命令的意义是在屏幕上显示log信息并在log信息结束后退出。
还以从OPhone主屏进入logcat应用的events bufferlog信息为例,如下所示:
view plaincopy to clipboardprint?
# logcat -db events
I/dvm_gc_madvise_info( 870): [610304,299008]
I/force_gc( 1372): bg
I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]
I/am_create_task( 804): 23
#
我们可以看到终端在log信息全部显示结束后就退出了logcat。
接下来,我们再来学习“-f”命令
-f命令的作用是将log信息作为文件保存起来
还以从OPhone主屏进入logcat应用的events bufferlog信息为例,如下所示:
view plaincopy to clipboardprint?
# mount -o remount,rw rootfs /
# logcat -b events -f /tmp/events
我们首先需要使用
view plaincopy to clipboardprint?
# mount -o remount,rw rootfs /
将文件系统改为可读写
然后就可以通过
view plaincopy to clipboardprint?
# logcat -b events -f /tmp/events
来将events buffer中的log信息存入 tmp文件夹下的events文件中
此时我们可以通过打开tmp目录下的events文件来查阅event buffer中的log信息
通过这个命令,我们的log信息就可以较为长久的保存在手机设备中,便于随时查阅
接下来,我们再来学习“-g”命令
-g命令的作用是查看三个log buffer的大小
如下所示:
view plaincopy to clipboardprint?
# logcat -g events
ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b
# logcat -g main
ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b
# logcat -g radio
ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b
接下来,我们再来学习“-n”和“-r”命令
这个命令需要和-f命令配套使用
-n命令的作用是设置日志的最大数目
-r命令的作用是每
view plaincopy to clipboardprint?
# logcat -n 3 -r 20 -f /tmp/events1
下面我们来学习一个重要的命令“-s”
-s命令的作用是设置默认的过滤级别以及过滤信息
下面我们首先来回顾一下main buffer中的log信息:
view plaincopy to clipboardprint?
D/skia ( 875): purging 200K from font cache [23 entries]
I/ActivityManager( 812): Starting activity: Intent { action=android.intent.action.MAIN flags=0x10200000 comp={com.borqs.logcat/com.borqs.logcat.Logcat} }
V/WindowManager( 812): before computeNewConfigurationLocked(mTempConfiguration)
V/Logcat ( 1821): Verbose
D/Logcat ( 1821): Debug
I/Logcat ( 1821): Info
W/Logcat ( 1821): Warn
E/Logcat ( 1821): Error
D/BorqsIME( 896): onStartInput ccontentType: 0 Restarting:false
I/ActivityManager( 812): Displayed activity com.borqs.logcat/.Logcat: 285 ms
D/dalvikvm( 812): GC freed 14185 objects / 618376 bytes in 209ms
我们可以看到log中有 V,D,I,W,E开头的不同log信息,事实上还有2种并不常见的级别更高的log信息F和S。
他们分别代表着不同的log级别
V — Verbose (最低级别)
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (最高级别)
下面我们来依次看一下使用不同的过滤级别所看到的log信息。
view plaincopy to clipboardprint?
# logcat -s "Logcat:d"
D/Logcat ( 1821): Debug
I/Logcat ( 1821): Info
W/Logcat ( 1821): Warn
E/Logcat ( 1821): Error
当我键入
view plaincopy to clipboardprint?
# logcat -s "Logcat:d"
命令时
我们看到了除了Verbose信息之外的其他级别的log信息。
接下来我们再看:
view plaincopy to clipboardprint?
# logcat -s "Logcat:i"
I/Logcat ( 1821): Info
W/Logcat ( 1821): Warn
E/Logcat ( 1821): Error
当我键入
view plaincopy to clipboardprint?
# logcat -s "Logcat:i"
我们看到了除了 Verbose和 Debug之外的其他级别的log信息。
接下来我们再看:
view plaincopy to clipboardprint?
# logcat -s "Logcat:w"
W/Logcat ( 1821): Warn
E/Logcat ( 1821): Error
当我键入
view plaincopy to clipboardprint?
# logcat -s "Logcat:w"
我们看到了除了Verbose,Debug和Info之外其他高级别的log信息。
下面我们再看:
view plaincopy to clipboardprint?
# logcat -s "Logcat:e"
E/Logcat ( 1821): Error
当我键入
view plaincopy to clipboardprint?
# logcat -s "Logcat:e"
我们就只能看到Error及其以上级别的log信息。我们可以用此命令来筛选不同内容,不同级别的log信息,摒除冗余信息的干扰。
最后我们来学习-v命令
-v命令的作用是设置log的输出格式
log的输出格式主要有7种,分别为:
brief — Display priority/tag and PID of originating process (the default format).
process — Display PID only.
tag — Display the priority/tag only.
thread — Display process:thread and priority/tag only.
raw — Display the raw log message, with no other metadata fields.
time — Display the date, invocation time, priority/tag, and PID of the originating process.
long — Display all metadata fields and separate messages with a blank lines.
下面我们来逐一看一下这7中输出格式各自的特点:
我们先来看brief格式的log:
view plaincopy to clipboardprint?
# logcat -v brief
-s "Logcat"
V/Logcat ( 1821): Verbose
D/Logcat ( 1821): Debug
I/Logcat ( 1821): Info
W/Logcat ( 1821): Warn
E/Logcat ( 1821): Error
这是我们所最为熟悉的一种,也是默认的log类型。
接下来我们再来看process格式的log:
view plaincopy to clipboardprint?
# logcat -v process -s "Logcat"
V( 1821) Verbose (Logcat)
D( 1821) Debug (Logcat)
I( 1821) Info (Logcat)
W( 1821) Warn (Logcat)
E( 1821) Error (Logcat)
Process格式的log把进程id放到了更靠前的位置
接下来我们再来看tag格式的log:
view plaincopy to clipboardprint?
# logcat -v tag -s "Logcat"
V/Logcat : Verbose
D/Logcat : Debug
I/Logcat : Info
W/Logcat : Warn
E/Logcat : Error
tag格式的log不包含进程id,将log的信息显示在了每行log的结尾
接下来我们再来看看thread格式的log:
view plaincopy to clipboardprint?
# logcat -v thread -s "Logcat"
V( 1821:0x71d) Verbose
D( 1821:0x71d) Debug
I( 1821:0x71d) Info
W( 1821:0x71d) Warn
E( 1821:0x71d) Error
Thread格式的log信息包含进程id,线程号以及log的级别信息
接下来我们再来看看raw格式的log:
view plaincopy to clipboardprint?
# logcat -v raw -s "Logcat"
Verbose
Debug
Info
Warn
Error
Raw格式的log只包含log中的内容,而不包含进程id,log级别等信息
接下来我们再来看一下time格式的log:
view plaincopy to clipboardprint?
# logcat -v time -s "Logcat"
08-11 16:58:46.130 V/Logcat ( 1821): Verbose
08-11 16:58:46.130 D/Logcat ( 1821): Debug
08-11 16:58:46.130 I/Logcat ( 1821): Info
08-11 16:58:46.130 W/Logcat ( 1821): Warn
08-11 16:58:46.130 E/Logcat ( 1821): Error
Raw格式的log比brief格式的log多了此log被调用的日期时间
最后我们来看一下long格式的log:
view plaincopy to clipboardprint?
# logcat -v long -s "Logcat"
[ 08-11 16:58:46.130 1821:0x71d V/Logcat ]
Verbose
[ 08-11 16:58:46.130 1821:0x71d D/Logcat ]
Debug
[ 08-11 16:58:46.130 1821:0x71d I/Logcat ]
Info
[ 08-11 16:58:46.130 1821:0x71d W/Logcat ]
Warn
[ 08-11 16:58:46.130 1821:0x71d E/Logcat ]
Error
long格式的log和raw格式的log形成了鲜明的对比,log中包括了此log被调用的时间,进程id,线程号,log级别和标记信息和log信息是所有log格式中最全面的一种。
我们在查看log信息时,可以根据不同的需要来调用不同格式的log信息。
总之,logcat是一个非常有用的程序调试工具。我们在程序中所发现的bug,通常需要测试人员将log信息记录下来供开发人员寻找缺陷的原因。特别是对于一些很严重,但是很难重现的bug而言,log信息更是非常珍贵的线索。所以,无论是对于开发人员还是测试人员来说,能否充分的利用和提取log中的有效信息是能否发现程序中已暴露缺陷的根源,进而解决此缺陷的关键因素。希望本文能够起到一个抛砖引玉的作用,希望热爱OPhone应用软件开发的朋友们能够更好的利用log信息,开发出更为健壮的软件作品。(作者:王植萌)