多终端执行ADB Logcat命令时输出不一致的同步问题求助
多终端执行ADB Logcat命令时输出不一致的同步问题求助
我太懂你这个糟心的情况了——同一个设备的日志,两个终端跑不同的过滤命令,结果却完全不同步,明明底部终端已经打出500错误了,顶部的过滤终端却死活不显示,还要在一堆日志里扒错误,简直浪费时间!
为啥会出现不同步的问题?
其实核心原因是:你开的两个adb logcat是两个独立的ADB客户端会话,它们各自从设备的日志缓冲区拉取日志,彼此的进度完全不共享。当日志产生速度快的时候,其中一个客户端(比如带多重过滤的那个)因为处理速度慢,设备日志缓冲区的旧日志会被新日志覆盖,直接导致它丢了部分日志,就出现了“一个有500、一个没抓到”的情况。
解决方法:统一日志源,让两个终端共享同一份日志流
这里给你几个实用的方案,选哪个看你调试习惯:
方案1:先把日志写到本地文件,再用两个终端实时读取
所有okhttp日志先统一写入一个本地文件,两个终端都从这个文件拉取内容,这样源是同一个,绝对不会不同步:
- 打开第一个终端,启动日志写入(会实时更新文件):
adb logcat | grep okhttp | cut -b -240 > ~/okhttp_debug_logs.txt
- 第二个终端,专门看状态码行:
tail -f ~/okhttp_debug_logs.txt | grep -e "-- "
- 第三个终端,看全量错误日志:
tail -f ~/okhttp_debug_logs.txt
调试完之后,这个文件还能留着回溯之前的日志,非常方便。
方案2:用命名管道(FIFO)代替物理文件,内存流转更轻量
不想生成本地文件的话,可以用系统的命名管道,日志只在内存里流转,用完就删:
- 先创建管道:
mkfifo ~/okhttp_fifo
- 一个终端把日志写入管道:
adb logcat | grep okhttp | cut -b -240 > ~/okhttp_fifo
- 另外两个终端分别读取管道:
# 终端1:过滤状态码 tail -f ~/okhttp_fifo | grep -e "-- " # 终端2:全量日志 tail -f ~/okhttp_fifo
调试结束后,删掉管道即可:rm ~/okhttp_fifo
方案3:单终端搞定!用高亮区分不同日志,不用开多个窗口
其实完全可以不用开两个终端,用awk给不同类型的日志加颜色标记,状态码行标红,400/500错误行标黄,一眼就能看到关键信息:
adb logcat | grep okhttp | cut -b -240 | awk '{ if ($0 ~ /-- /) { # 状态码行标红色 print "\033[31m" $0 "\033[0m" } else if ($0 ~ /400|500/) { # 错误行标黄色 print "\033[33m" $0 "\033[0m" } else { # 普通日志正常显示 print $0 } }'
这样在同一个窗口里,关键的状态码和错误日志都有颜色提醒,既不会错过500错误,也不用来回切终端,效率直接拉满!
最后再提醒下
以后调试时尽量避免同时开多个adb logcat独立会话,毕竟设备的日志缓冲区容量有限,多客户端抢日志很容易丢数据。统一日志源之后,不管是分窗口看还是单窗口高亮,都能保证日志的一致性啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

