Android日志系统提供了收集和查看系统调试输出的机制。Logcat转储了系统消息的日志,包括当模拟器抛出一个错误时的堆栈信息和你在应用中使用Log类写的信息。你可以通过ADB或在DDMS中运行LogCat,它允许你实时阅读信息。
Log类
Log是一个日志记录类,可以在代码中使用来打印信息到LogCat。常用的记录方法包括:
- v(String, String) (verbose)
- d(String, String) (debug)
- i(String, String) (information)
- w(String, String) (warning)
- e(String, String) (error)
例如:
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
之后Logcat就会输出类似如下内容:
I/MyActivity( 1557): MyClass.getView() — get item number 1
使用LogCat
你可以在DDMS中使用LogCat或者在ADB shell调用。通过ADB shell运行LogCat的通常使用方法是:
[adb] logcat [<option>] ... [<filter-spec>] ...
你可以在开发机中或者在模拟器/设备上的远程adb shell使用logcat命令。在开发机上查看日志输出,使用
$ adb logcat
从一个远程adb shell中使用:
/# logcat
下面的表格描述了logcat命令行选项:
选项 | 作用 |
---|---|
-c | 清除(刷新)整个日志比并退出 |
-d | 转储日志到屏幕并退出 |
-f <filename> | 写入日志信息输出到<filename>。默认是stdout |
-g | 打印指定缓冲大小的日志并退出 |
-n <count> | 设置日志轮转的最大数量。默认值是4,需要 -r 选项 |
-r <kbytes> | 设置输出的轮转日志文件大小。模式值是16,需要 -f 选项 |
-s | 设置默认的过滤器为silent |
-v <format> | 设置日志信息的输出格式。默认是brief格式 |
过滤日志输出
每一个Android日志信息都关联着一个标签和优先级。
- 日志消息的标签是一个短字符串,标识着消息从哪个系统组件产生的(例如,”View”代表视图系统)。
- 优先级是下面字符串中的一个,按照从低到高优先级排序如下:
- V - Verbose(最低优先级)
- D - Debug
- I - Info
- W - Warning
- E - Error
- F - Fatal
- S - Silent(最高优先级,没有任何输出)
通过运行LogCat查看每条信息以<priority>/<tag>标识着的最前面两列,可以获取到在系统中使用的标签和优先级列表。
下面的logcat输出例子显示了关联优先级”l”和标签”ActivityManager”的信息:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
要减少日志输出到一个可管理水平,使用过滤表达式限制日志输出。过滤表达式让你向系统标识你所感兴趣的标签-优先级组合,系统会根据指定的标签抑制其他的信息。
一个过滤表达式遵循 tag:priority … 这种格式,其中 tag 标识感兴趣的标签, priority 标识着报告这个标签的最低优先级。这个标签的指定优先级或更高的信息被写入到日志中。你可以在一个过滤表达式中应用很多 tag:priority 规范。这一些系列的规范用空格分隔。
这里是一个过滤表达式的例子,抑制了除了以”ActivityManager”为标签、优先级在”Info”或更高的,和以”MyApp”为标签、优先级在”Debug”或更高的所有消息:
adb logcat ActivityManager:I MyApp:D *:S
上面表达式的最后一个元素*:s,设置所有的标签优先级为”silent”,因此确保了只有”ActivityManager”和”MyApp”的信息显示。使用*:s是一个很好的方式去确保日志输出使用你明确指定的过滤器进行约束——它让你的过滤器作为日志输出的“白名单”。
下面的过滤表达式显示所有标签的优先级在”warning”或更高的日志信息。
adb logcat *:W
如果你在自己的开发机上运行LogCat(相对于在一个远程adb shell运行),你也可以通过导出ANDROID_LOG_TAGS的环境变量值来设置默认的过滤表达式:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
而如果你使用 adb shell logcat 运行LogCat,ANDROID_LOG_TAGS 过滤器就不会导出到模拟器/设备上。
控制日志输出格式
日志消息包含了一系列的元数据字段,及额外的标签和优先级。你可以修改信息输出格式从而显示指定的元数据字段。要这样做,使用 -v 选项,然后指定下面支持的输出格式列表中的一个。
- brief - 显示优先级/标签和发出信息的进程PID(默认格式)
- process - 只显示PID
- tag - 只显示优先级/标签
- raw - 显示原始日志消息,没有其他元数据字段
- time - 显示日期,发生时间,优先级/标签,以及发出信息的进程PID
- threadtime - 显示日式,发生时间,优先级,标签,以及发出信息的PID和线程TID
- long - 显示所有的元数据字段并用空行分隔信息。
当启动LogCat时,你可以通过 -v 选项指定你想要的输出格式:
[adb] logcat [-v <format>]
这里是一个例子显示了如何生成 thread 输出格式的信息:
adb logcat -v thread
记住你只能使用 -v 选项指定一个输出格式。
查看可选日志缓冲区
Android日志系统为日志信息维持了多个循环缓冲区,并不是所有的日志信息都发送到默认的循环缓冲区。要查看额外的日志信息,你可以使用 -b 选项运行 logcat ,来请求查看一个可选循环缓冲区。你可以查看任何一个可选缓冲区:
- radio - 查看包含radio/telephony相关信息的缓冲区
- events - 查看包含相关事件信息的缓冲区
- main - 查看主要的日志缓冲区(默认)
-b 选项的使用方法:
[adb] logcat [-b <buffer>]
这里是一个如何查看包含radio和telephony信息的日志缓冲区:
adb logcat -b radio
查看stdout和stderr
默认情况下,Android系统发送 stdout 和 stderr ( System.out 和 System.err )输出到 /dev/null 。在运行Dalvik VM的进程中,你可以让系统写这个输出的副本到日志文件。这种情况下,系统使用 stdout 和 stderr 标签,都使用 I 优先级来写信息到日志中。
要通过这种方式重定向输出,停止运行的模拟器/设备实例,然后使用shell命令 setprop 来启用输出冲定西。这里是如何去做:
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
系统保留这个设置直到你终止模拟器/设备实例。要在模拟器/设备实例上使用这个设置作为默认,你可以在设备的 /data/local.prop 添加一个条目。
调试Web应用
如果你正在开发一个Android的web应用,你可以使用控制台JavaScript APIs来调试你的JavaScript,它会输出信息到LogCat。
原文链接:
http://developer.android.com/tools/debugging/debugging-log.html