logcat 是一个命令行工具,用于转储系统消息日志,其中包括设备引发错误时的堆叠追踪以及从您的应用使用 Log 类编写的消息
基本语法
adb logcat : 通过adb命令去捕获logcat日志
adb shell : 通过adb命令进入到模拟器的linux系统中
Logcat命令行选项
下面介绍的是logcat
命令行选项
格式:[adb] logcat [<option>] ... [<filter-spec>] ...
-c 清除(刷新)整个日志并退出。
-d 将日志转储到屏幕并退出。
-f <filename> 将日志消息输出写入 <filename>。默认值为 stdout。
-g 打印指定日志缓冲区的大小并退出。
-n <count> 将已旋转日志的最大数量设置为 <count>。默认值为 4。 需要使用 -r 选项。
-r <kbytes> 每输出 <kbytes> 时旋转日志文件。默认值为 16。需要使用 -f 选项。
-s 将默认过滤器规则设为静默式。
-v <format> 设置日志消息的输出格式。默认值为 brief 格式有关支持的格式列表.
以下是通过 ADB shell 运行 logcat 的一般用法
过滤日志输出
日志级别分为以下等级(从低到高排列):V - 详细
D - 调试
I - 信息
W - 警告
E - 错误
F - 致命
S - 静默(最高优先级,不会打印任何信息)
//JAVA代码
Log.i("Hello","InitViews -> ( ̄▽ ̄)");
Log.d("Hi","InitView -> (#^.^#)");
//AS的Logcat控制台打印
08-21 09:41:56.954 11314-11314/? I/Hello: InitViews -> ( ̄▽ ̄)
08-21 09:52:41.020 12179-12179/com.monsterlin.androidpractice D/Hi: InitView -> (#^.^#)
==>通过对应,我们发现其日志的表现形式为:<priority>/<tag>
//对应的Log命令
// 该命令的作用为阻止带有标记Hello,优先级等于或高于I的日志消息,以及带有标记Hi,优先级等于或高级D的日志消息以外的所有的日志消息
logcat Hello:I Hi:D *:S
//最后一个元素 *:S 将所有标记的优先级设为“静默”,从而确保系统仅显示带有“ActivityManager”和“MyApp”标记的日志消息
//结果输出
130|dipper:/ $ logcat Hello:I Hi:D *:S
--------- beginning of system
--------- beginning of main
08-21 09:52:41.020 12179 12179 I Hello : InitViews -> ( ̄▽ ̄)
08-21 09:52:41.020 12179 12179 D Hi : InitView -> (#^.^#)
控制日志输出格式
使用-v
选项,并指定下面列出的支持的输出格式之一
brief — 显示优先级/标记以及发出消息的进程的 PID(默认格式)。
process — 仅显示 PID。
tag — 仅显示优先级/标记。
raw — 显示原始日志消息,不显示其他元数据字段。
time — 显示日期、调用时间、优先级/标记以及发出消息的进程的 PID。
threadtime — 显示日期、调用时间、优先级、标记以及发出消息的线程的 PID 和 TID。
long — 显示所有元数据字段,并使用空白行分隔消息。
启动 logcat 时,您可以使用 -v 选项指定您需要的输出格式:
[adb] logcat [-v <format>]
==> logcat -v thread
I( 2441: 2453) uid=10189(com.tencent.mobileqq) HeapTaskDaemon expire 2 lines
I( 2493: 2493) uid=10189 com.tencent.mobileqq:MSF expire 18 lines
I( 6344: 6418) uid=10189 com.tencent.mobileqq:peak expire 4 lines
I( 6344: 6424) uid=10189 com.tencent.mobileqq:peak expire 37 lines
I( 6344: 6422) uid=10189 com.tencent.mobileqq:peak expire 2 lines
查看备用日志的缓冲区
Android 日志系统保留日志消息的多个循环缓冲区,而不是发送到默认循环缓冲区的所有日志消息。如需查看其他日志消息,您可以使用 -b 选项运行 logcat 命令,以请求查看备用循环缓冲区
radio — 查看包含无线装置/电话相关消息的缓冲区。
events — 查看包含事件相关消息的缓冲区。
main — 查看主要日志缓冲区(默认值)
[adb] logcat [-b <buffer>]
==> adb logcat -b radio
08-21 10:13:56.697 2134 2134 D RILJ : [5139]> OPERATOR [SUB1]
08-21 10:13:56.698 2134 2134 D RILJ : [5140]> DATA_REGISTRATION_STATE [SUB1]
08-21 10:13:56.698 2134 2134 D RILJ : [5141]> VOICE_REGISTRATION_STATE [SUB1]
08-21 10:13:56.699 2134 2134 D RILJ : [5142]> QUERY_NETWORK_SELECTION_MODE [SUB1]
08-21 10:13:56.705 2134 2254 D RILJ : [5139]< OPERATOR {小米移动, 小米移动, 46001} [SUB1]
查看stdout和stdeer
默认情况下,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