logcat用法
官方文档:https://developer.android.com/studio/command-line/logcat
TID(线程控制符)英文全称为THREAD Identifier,它也属于电工电子类技术术语。 TID就是线程的身份标识,进程一运行系统就会自动分配给各线程独一无二的TID。 类似于进程的概念。
PID(Process Identification)操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。PID(进程控制符)英文全称为Process Identifier。PID是各进程的代号,每个进程有唯一的PID编号。它是进程运行时系统分配的,并不代表专门的进程。在运行时PID是不会改变标识符的,但是进程终止后PID标识符就会被系统回收,就可能会被继续分配给新运行的程序。
只要运行一程序,系统会自动分配一个标识。是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。只要没有成功运行其他程序,这个PID会继续分配给当前要运行的程序。如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个PID。
下表介绍了 logcat 的命令行选项。
选项 | 说明 |
-b <buffer> | 加载可供查看的备用日志缓冲区,例如 events 或 radio。默认使用 main、system 和 crash 缓冲区集。请参阅查看备用日志缓冲区。 |
-c, --clear | 清除(清空)所选的缓冲区并退出。默认缓冲区集为 main、system 和 crash。如需清除所有缓冲区,请使用 -b all -c。 |
-e <expr>, --regex=<expr> | 只输出日志消息与 <expr> 匹配的行,其中 <expr> 是正则表达式。 |
-m <count>, --max-count=<count> | 输出 <count> 行后退出。这样是为了与 --regex 配对,但可以独立运行。 |
| 与 --regex 和 --max-count 配对,使内容绕过正则表达式过滤器,但仍能够在获得适当数量的匹配时停止。 |
-d | 将日志转储到屏幕并退出。 |
-f <filename> | 将日志消息输出写入 <filename>。默认值为 stdout。 |
-g, --buffer-size | 输出指定日志缓冲区的大小并退出。 |
-n <count> | 将轮替日志的数量上限设置为 <count>。默认值为 4。需要使用 -r 选项。 |
-r <kbytes> | 每输出 <kbytes> 时轮替日志文件。默认值为 16。需要 -f 选项。 |
-s | 相当于过滤器表达式 '*:S';它将所有标记的优先级设为“静默”,并用于放在可添加内容的过滤器表达式列表之前。如需了解详情,请转到介绍过滤日志输出的部分。 |
-v <format> | 设置日志消息的输出格式。默认格式为 threadtime。如需查看支持的格式列表,请参阅介绍控制日志输出格式的部分。 |
-D, --dividers | 输出各个日志缓冲区之间的分隔线。 |
-c | 清空(清除)整个日志并退出。 |
-t <count> | 仅输出最新的行数。此选项包括 -d 功能。 |
-t '<time>' | 输出自指定时间以来的最新行。此选项包括 -d 功能。如需了解如何引用带有嵌入空格的参数,请参阅 -P 选项。
adb logcat -t '01-26 20:52:41.820' |
-T <count> | 输出自指定时间以来的最新行数。此选项不包括 -d 功能。 |
-T '<time>' | 输出自指定时间以来的最新行。此选项不包括 -d 功能。如需了解如何引用带有嵌入空格的参数,请参阅 -P 选项。
adb logcat -t '01-26 20:52:41.820' |
-L, -last | 在最后一次重新启动之前转储日志。 |
-B, --binary | 以二进制文件形式输出日志。 |
-S, --statistics | 在输出中包含统计信息,以帮助您识别和定位日志垃圾信息发送者。 |
-G <size> | 设置日志环形缓冲区的大小。可以在结尾处添加 K 或 M,以指示单位为千字节或兆字节。 |
-p, --prune | 输出(读取)当前的允许 (white) 列表和拒绝 (black) 列表,不采用任何参数,如下所示:
adb logcat -p |
-P '<list> ...' --prune '<list> ...' -P '<white_and_black_list>' | 写入(设置)允许 (white) 列表和拒绝 (black) 列表以出于特定目的调整日志记录内容。您可以提供允许 (<white>) 列表和拒绝 (~<black>) 列表条目的混合内容,其中 <white> 或 <black> 可以是 UID、UID/PID 或 /PID。在 Logcat 统计信息 (logcat -S) 的指导下,您可以考虑出于各种目的调整允许 (white) 列表和拒绝 (black) 列表,例如:
默认情况下,日志记录系统会自动以动态方式阻止日志统计信息中最严重的违规内容,以便为新的日志消息腾出空间。一旦它用尽启发法,系统便会删除最旧的条目,以便为新消息腾出空间。 添加许可名单 (whitelist) 可保护您的 Android 识别码 (AID),它会变成进程的 AID 和 GID,而不会被声明为违规内容;添加拒绝列表有助于在相应内容被视为最严重的违规内容之前即释放空间。您可以选择删除内容的程度和频率;也可以关闭删除功能,这样,系统便仅会移除各个日志缓冲区中最旧条目的内容。 引号 adb logcat 不会保留引号,因此指定允许 (white) 列表和拒绝 (black) 列表的语法如下所示:
$ adb logcat -P '"<white_and_blacklist>"'
or
adb shell $ logcat -P '<white_and_blacklist>' 以下示例指定了一个包含 PID 32676 和 UID 675 的允许 (white) 列表,以及一个包含 PID 32677 和 UID 897 的拒绝 (black) 列表。拒绝列表中的 PID 32677 经过加权处理,以便可以更快删除。
adb logcat -P '"/32676 675 ~/32677 897"' 其他您可以使用的允许 (white) 列表和拒绝 (black) 列表命令变体如下所示:
~! worst uid blacklist ~1000/! worst pid in system (1000) |
--pid=<pid> ... | 仅输出来自给定 PID 的日志。 |
--wrap | 休眠 2 小时或者当缓冲区即将封装时(两者取其先)。通过提供即将封装唤醒来提高轮询的效率。 |
-
日志消息的标记是一个简短的字符串,指示消息所源自的系统组件(例如,“View”表示视图系统)。
-
优先级是以下字符值之一(按照从最低到最高优先级的顺序排列):
-
-
V:详细(最低优先级)
-
D:调试
-
I:信息
-
W:警告
-
E:错误
-
F:严重错误
-
S:静默(最高优先级,绝不会输出任何内容)
-
-
控制日志输出格式
除标记和优先级外,日志消息还包含许多元数据字段。您可以修改消息的输出格式,以便它们显示特定的元数据字段。为此,您可以使用 -v 选项,并指定下列某一受支持的输出格式。
-
brief:显示优先级、标记以及发出消息的进程的 PID。
-
long:显示所有元数据字段,并使用空白行分隔消息。
-
process:仅显示 PID。
-
raw:显示不包含其他元数据字段的原始日志消息。
-
tag:仅显示优先级和标记。
-
thread::旧版格式,显示优先级、PID 以及发出消息的线程的 TID。
-
threadtime(默认值):显示日期、调用时间、优先级、标记、PID 以及发出消息的线程的 TID。
-
time:显示日期、调用时间、优先级、标记以及发出消息的进程的 PID。
adb logcat -v threadtime //默认
05-08 15:52:31.487 7637 7637 I Tuya : QRcodeLoginPresenter false equals
日期(05-08)、调用时间(15:52:31.487)、PID(7637),发出消息的线程的TID(7637),优先级(I)、标记(Tuya)、信息(QRcodeLoginPresenter false equals)
adb logcat -v brief
I/Tuya ( 7637): UserPreferenceUtil getString
显示优先级(I)、标记(Tuya),发出消息的进程的 PID(7637):信息(UserPreferenceUtil getString)
adb logcat -v long
[ 05-08 15:58:58.229 7637: 7832 D/Tuya ]
HttpEventListener api: tuya.m.user.qr.token.user.get 1.0
显示所有元数据字段,并使用空白行分隔消息
日期(05-08),调用时间(15:58:58.229)PID(7637),优先级(D):标记(Tuya),信息(HttpEventListener api: tuya.m.user.qr.token.user.get 1.0)
adb logcat -v process
W( 7637) at java.lang.Thread.run(Thread.java:919) (System.err)
优先级(W),PID(7637),信息(at java.lang.Thread.run(Thread.java:919)),标记(System.err)
adb logcat -v raw
onReceive Intent { act=android.intent.action.SERVICE_STATE flg=0x1000010 cmp=com.android.cellbroadcastreceiver/.CellBroadcastReceiver (has extras) }
uid=10071(com.sand.airdroid) Timer-0 expire 2 lines
uid=10071(com.sand.airdroid) AsyncTask #1 expire 2 lines
uid=10265(com.cnd.zhongkong) pool-4-thread-2 expire 6 lines
uid=10265(com.cnd.zhongkong) .tuyacn.com/... expire 54 lines
显示不包含其他元数据字段的原始日志消息。
adb logcat -v tag
W/System.err: at java.lang.Thread.run(Thread.java:919)
E/Tuya : Business apiName: null errorMsg:JSON PARSE EXCEPTION
I/Tuya : QRCodeLoginModel tokenUserGet onFailure: 101001 JSON PARSE EXCEPTION
优先级(W)/标记(System.err):信息(at java.lang.Thread.run(Thread.java:919))
adb logcat -v thread
I( 7637: 7637) QRcodeLoginPresenter false equals
V( 7637: 7896) CommsReceiver run 852
I( 8100: 8120) ALICE: Tick timer, status: FINISHED
I( 8100: 8120) ALICE: Execute task
优先级(V)PID(7637)发出消息的线程的 TID(7896)
adb logcat -v time
05-08 16:36:02.271 I/A ( 8057): The syncToken for corpus ASSISTANT_UPDATES_CENTER_POOL is EgkIoueW4Z658AI=.
05-08 16:36:02.305 I/A ( 8057): The syncToken for corpus DEVICE_INSTALLED_APPS is EgkIoueW4Z658AI=.
05-08 16:36:02.317 I/A ( 8057): The syncToken for corpus GELLER_CONFIG is EgkIoueW4Z658AI=.
05-08 16:36:02.329 I/A ( 8057): The syncToken for corpus HABITS_PROFILE is EgkIoueW4Z658AI=.
日期(05-08),时间(16:36:02.271),优先级(I),标记(A),PID(8057),消息(The syncToken for corpus ASSISTANT_UPDATES_CENTER_POOL is EgkIoueW4Z658AI=.)
-
格式修饰符
-
color:使用不同的颜色来显示每个优先级。
-
descriptive:显示日志缓冲区事件说明。此修饰符仅影响事件日志缓冲区消息,不会对其他非二进制文件缓冲区产生任何影响。事件说明取自 event-log-tags 数据库。
-
epoch:显示自 1970 年 1 月 1 日以来的时间(以秒为单位)。
-
monotonic:显示自上次启动以来的时间(以 CPU 秒为单位)。
-
printable:确保所有二进制日志记录内容都进行了转义。
-
uid:如果访问控制允许,则显示 UID 或记录的进程的 Android ID。
-
usec:显示精确到微秒的时间。
-
UTC:显示 UTC 时间。
-
year:将年份添加到显示的时间。
-
zone:将本地时区添加到显示的时间。