在命令行下过滤adb logcat的输出

本文分享了在Android开发中高效使用Logcat过滤日志的方法,包括使用grep进行白名单和黑名单过滤、按PID过滤同一进程日志、清除缓存只看最新日志、过滤log文件、查看不同日志缓冲区及打印系统时间和进程名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发当中经常看到 log 如洪水般瞬间刷满了屏幕,对自己有用的信息都被淹没了,影响心情也影响效率。下面是几个我所知道的过滤方法。

1. 只显示需要的输出,白名单

最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配。简单的匹配一行当中的某个字符串,例如 MyApp:

adb logcat | grep MyApp
adb logcat | grep -i myapp #忽略大小写。
adb logcat | grep --color=auto -i  myapp #设置匹配字符串颜色。更多设置请查看 grep 帮助。

进阶一点可以使用 grep 的正则表达式匹配。例如上一个例子会匹配一行中任意位置的 MyApp,可以设置为仅匹配 tag。默认的 log 输出如下,如果修改过输出格式相应的表达式也要修改。

I/CacheService(  665): Preparing DiskCache for all thumbnails.

可以看出 tag 是一行开头的第三个字符开始,根据这点写出表达式:

adb logcat | grep "^..MyApp"

根据这个格式也可以设置只显示某个优先级的 log,再匹配行首第一个字符即可。例如仅显示 Error 级别 tag 为 MyApp 的输出:

adb logcat | grep "^E.MyApp"

当然也可以匹配多个,使用 | 分割多个匹配表达式,要加转义符。例如要匹配 tag 为 MyApp 和 MyActivity 的输出:

adb logcat | grep "^..MyApp\|^..MyActivity"
adb logcat | grep -E "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符

2. 过滤不需要的输出,黑名单

还是使用 grep,用法也跟上面的一样,加一个 -v 即可。例如要过滤 tag 为 MyApp 和 MyActivity 的输出:

adb logcat | grep -v "^..MyApp\|^..MyActivity"
adb logcat | grep -vE "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符

3. 显示同一个进程的所有输出

有时一个程序里面的 tag 有多个,需要输出该程序(同一个 PID)的所有 tag;仅使用 tag 过滤有时也会漏掉一些错误信息,而一般错误信息也是和程序同一个 PID。还是通过 grep 实现,思路是先根据包名找到 pid 号,然后匹配 pid。写成 shell 脚本如下,参数是程序的 java 包名(如 com.android.media)。

#!/bin/bash
packageName=$1
pid=`adb shell ps | grep $packageName | awk '{print $2}'`
adb logcat | grep --color=auto $pid

4. 从当前开始显示

logcat 有缓存,如果仅需要查看当前开始的 log,需要清空之前的。

adb logcat -c && adb logcat

5. 过滤 log 文件

有时需要分析 log 文件,过滤 log 文件还是使用 grep。例如 log 文件为 myapp.log,要匹配 tag 为 MyApp 和 MyActivity 的输出,然后输出到 newmyapp.log:

cat myapp.log | grep "^..MyApp\|^..MyActivity" > newmyapp.log

Windows 下推荐使用Notepad++,一个免费强大的记事本,支持正则表达式查找替换。可以高亮显示匹配内容,也可以删除不需要的内容。

以上的技巧主要用到了 grep,其实 logcat 本身也有过滤功能,可以根据 tag、优先级过滤 log,具体请参考 Android 官方文档Reading and Writing Logs。如果喜欢使用图形界面,请参考Using DDMS,DDMS 里面的 logcat 也可以同样过滤。


6.查看 可用日志缓冲区
Android日志系统有循环缓冲区,并不是所有的日志系统都有默认循环缓冲区。为了得到 日志信息,你需要通过-b 选项来启动logcat 。如果要使用循环缓冲区,你需要查看剩余的 循环缓冲期:
 -b <buffer>     Request alternate ring buffer, 'main', 'system', 'radio'  
                  or 'events'. Multiple -b parameters are allowed and the  
                  results are interleaved. The default is -b main -b system.  

radio — 查看缓冲区的相关的信息.
events — 查看和事件相关的的缓冲区.
main — 查看主要的日志缓冲区
system -  与系统相关的日志信息
-b 选项使用方法:

[adb] logcat [-b <buffer>]
下面的例子表示怎么查看日志缓冲区包含radio 和 telephony信息:

adb logcat -b radio
adb logcat -c && adb logcat -b main -b system -s NotificationService

高版本的logcat可以使用 -b all 获取到所有缓冲区的日志

7.logcat如何打印出系统时间和进程名
logcat -v time > log.txt&
再加上线程号的话
logcat -v threadtime > log.txt &

注意:
以上很多命令要在Linux 下面执行,因为windows下直接不能直接grep 命令.下面介绍几个可以在Window 命令行下直接使用的几个常用的命令:
1.过滤某一个标签的log:adb logcat -s xxx

2.过滤几个标签的log:adb logcat MyTag:D MyOtherTag:W *:S
    注意不要忘记*:S 部分,他表示可以过滤掉娶她的日志信息(S代表Slient)
            例子:adb logcat -c && adb logcat  fingerprintd AliFingerprintService *:S
3.先执行adb shell,在执行logcat |grep xxx
    如果要同时grep 查询多个字符,可以修改使用以下命令:logcat |grep -E "aaaa|BBB"(linux 下可以使用adb logcat |egrep 'xxx|yyyy|zzz')
        
    或者 logcat |grep -e onAuthenticationSucceeded -e fingerprintd -e seat

开发当中经常看到 log 如洪水般瞬间刷满了屏幕,对自己有用的信息都被淹没了,影响心情也影响效率。下面是几个我所知道的过滤方法。

1. 只显示需要的输出,白名单

最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配。简单的匹配一行当中的某个字符串,例如 MyApp:

adb logcat | grep MyApp
adb logcat | grep -i myapp #忽略大小写。
adb logcat | grep --color=auto -i  myapp #设置匹配字符串颜色。更多设置请查看 grep 帮助。

进阶一点可以使用 grep 的正则表达式匹配。例如上一个例子会匹配一行中任意位置的 MyApp,可以设置为仅匹配 tag。默认的 log 输出如下,如果修改过输出格式相应的表达式也要修改。

I/CacheService(  665): Preparing DiskCache for all thumbnails.

可以看出 tag 是一行开头的第三个字符开始,根据这点写出表达式:

adb logcat | grep "^..MyApp"

根据这个格式也可以设置只显示某个优先级的 log,再匹配行首第一个字符即可。例如仅显示 Error 级别 tag 为 MyApp 的输出:

adb logcat | grep "^E.MyApp"

当然也可以匹配多个,使用 | 分割多个匹配表达式,要加转义符。例如要匹配 tag 为 MyApp 和 MyActivity 的输出:

adb logcat | grep "^..MyApp\|^..MyActivity"
adb logcat | grep -E "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符

2. 过滤不需要的输出,黑名单

还是使用 grep,用法也跟上面的一样,加一个 -v 即可。例如要过滤 tag 为 MyApp 和 MyActivity 的输出:

adb logcat | grep -v "^..MyApp\|^..MyActivity"
adb logcat | grep -vE "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符

3. 显示同一个进程的所有输出

有时一个程序里面的 tag 有多个,需要输出该程序(同一个 PID)的所有 tag;仅使用 tag 过滤有时也会漏掉一些错误信息,而一般错误信息也是和程序同一个 PID。还是通过 grep 实现,思路是先根据包名找到 pid 号,然后匹配 pid。

写成 shell 脚本如下,参数是程序的 java 包名(如 com.android.media)。

#!/bin/bash
packageName=$1
pid=`adb shell ps | grep $packageName | awk '{print $2}'`
adb logcat | grep --color=auto $pid

4. 从当前开始显示

logcat 有缓存,如果仅需要查看当前开始的 log,需要清空之前的。

adb logcat -c && adb logcat

5. 过滤 log 文件

有时需要分析 log 文件,过滤 log 文件还是使用 grep。例如 log 文件为 myapp.log,要匹配 tag 为 MyApp 和 MyActivity 的输出,然后输出到 newmyapp.log:

cat myapp.log | grep "^..MyApp\|^..MyActivity" > newmyapp.log

Windows 下推荐使用Notepad++,一个免费强大的记事本,支持正则表达式查找替换。可以高亮显示匹配内容,也可以删除不需要的内容。

以上的技巧主要用到了 grep,其实 logcat 本身也有过滤功能,可以根据 tag、优先级过滤 log,具体请参考 Android 官方文档Reading and Writing Logs。如果喜欢使用图形界面,请参考Using DDMS,DDMS 里面的 logcat 也可以同样过滤。


6.查看 可用日志缓冲区
Android日志系统有循环缓冲区,并不是所有的日志系统都有默认循环缓冲区。为了得到 日志信息,你需要通过-b 选项来启动logcat 。如果要使用循环缓冲区,你需要查看剩余的 循环缓冲期:
 -b <buffer>     Request alternate ring buffer, 'main', 'system', 'radio'  
                  or 'events'. Multiple -b parameters are allowed and the  
                  results are interleaved. The default is -b main -b system.  

radio — 查看缓冲区的相关的信息.
events — 查看和事件相关的的缓冲区.
main — 查看主要的日志缓冲区
system -  与系统相关的日志信息
-b 选项使用方法:

[adb] logcat [-b <buffer>]
下面的例子表示怎么查看日志缓冲区包含radio 和 telephony信息:

adb logcat -b radio
adb logcat -c && adb logcat -b main -b system -s NotificationService

7.logcat如何打印出系统时间和进程名
logcat -v time > log.txt&
再加上线程号的话
logcat -v threadtime > log.txt &

注意:
以上很多命令要在Linux 下面执行,因为windows下直接不能直接grep 命令.下面介绍几个可以在Window 命令行下直接使用的几个常用的命令:
1.过滤某一个标签的log:adb logcat -s xxx

2.过滤几个标签的log:adb logcat MyTag:D MyOtherTag:W *:S
    注意不要忘记*:S 部分,他表示可以过滤掉娶她的日志信息(S代表Slient)
            例子:adb logcat -c && adb logcat  fingerprintd AliFingerprintService *:S
3.先执行adb shell,在执行logcat |grep xxx
    如果要同时grep 查询多个字符,可以修改使用以下命令:logcat |grep -E "aaaa|BBB"(linux 下可以使用adb logcat |egrep 'xxx|yyyy|zzz')
        
    或者 logcat |grep -e onAuthenticationSucceeded -e fingerprintd -e seat

阅读更多
<think>首先,用户的问题是:“我想在使用adb logcat时,希望通过包名过滤特定apk的日志输出 请问adb logcat filter by package name”。这是一个关于Android开发中adb logcat命令的使用问题。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个上下文中,可能没有数学表达式,所以我不需要添加。 - 独立公式必须使用$$...$$格式并单独成段,同样,这里可能不需要。 - LaTeX语法正确:确保如果使用数学表达式,语法正确。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答结束后,添加“相关问题”部分。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。参考提供的引用,引用[1]、[2]、[3]是关于adb logcat的,包括过滤log的技巧。 用户提供的引用: - 引用[1]:ADB logcat 总结,提到使用grep过滤log,以及logcat本身的过滤功能。 - 引用[2]:adb logcat 最详细说明,展示使用grep过滤特定PID的log。 - 引用[3]:Android logcat PID packageName 筛选,提供一个Python脚本通过包名获取PID并过滤log。 用户的需求是:通过包名(package name)过滤特定APK的日志输出adb logcat本身不直接支持通过包名过滤,但可以通过进程ID(PID)来间接实现,因为每个运行的应用都有一个唯一的PID。 标准方法是: 1. 获取应用的PID:使用adb shell ps | grep <package_name> 来找到该应用的PID。 2. 然后使用adb logcat --pid=<PID> 来过滤该PID的日志。 或者,结合grep命令:adb logcat | grep <PID>。 引用[3]提供了一个Python脚本来自动化这个过程:通过包名获取所有相关PID,然后用grep过滤log。 在回答中,我需要: - 结构清晰,逐步解决问题。 - 保证回答真实可靠:基于Android官方文档和常见实践。 - 参考提供的引用:自然地融入引用。 回答结构: 1. **理解问题**:解释用户需求。 2. **核心方法**:adb logcat本身不支持直接包名过滤,但可以通过PID间接实现。 3. **步骤详解**: - 步骤1:获取应用的PID。 - 命令:adb shell ps | grep <package_name> - 步骤2:使用PID过滤log。 - 命令:adb logcat --pid=<PID> - 或使用grepadb logcat | grep <PID> 4. **自动化脚本**:提到引用[3]的Python脚本,简化过程。 5. **其他方法**:参考引用[1],logcat有内置过滤功能,但基于tag和priority,而不是包名。DDMS图形界面可能更易用。 6. **完整示例**:给一个具体例子。 最后,添加相关问题。 生成相关问题: - 基于主题:adb logcat过滤、性能优化、常见问题等。 - 例如: 1. 如何过滤特定tag的日志? 2. adb logcat的其他过滤选项有哪些? 3. 如何保存logcat输出到文件? 4. 处理多个PID的情况? 确保回答用中文。 完整回答: - 开头:直接回答用户问题。 - 主体:分步骤解释。 - 结尾:相关问题。</think>### 通过包名过滤 adb logcat 日志的方法 在使用 adb logcat 时,系统本身不直接支持通过包名(package name)过滤特定 APK 的日志输出。但您可以通过间接方式实现:先获取应用的进程 ID(PID),然后基于 PID 过滤日志。以下是清晰、可靠的步骤指南,基于 Android 官方文档和常见实践(参考提供的引用内容)。 #### 步骤 1: 获取应用的 PID adb logcat过滤功能主要基于 PID 或 tag,而不是包名。因此,您需要先找到目标 APK 的进程 ID(PID)。 - **命令**:使用 `adb shell ps` 结合 `grep` 搜索包名。 示例:假设包名为 `com.example.app`,运行: ```bash adb shell ps | grep com.example.app ``` - **输出示例**: ``` u0_a123 4567 1234 com.example.app ``` 其中,`4567` 是 PID(第二列)。如果应用有多个进程,您可能获取多个 PID。 注意:如果 grep 不可用(某些设备),请使用 `adb shell ps | findstr com.example.app`(Windows)或确保设备已安装 grep 工具[^1]。 #### 步骤 2: 使用 PID 过滤日志 获取 PID 后,您可以通过以下方法过滤日志: - **方法 1: 使用 logcat 的 `--pid` 参数(推荐,高效)** 命令: ```bash adb logcat --pid=<PID> ``` 示例:如果 PID 是 `4567`,则运行: ```bash adb logcat --pid=4567 ``` 这将只输出该 PID 相关的日志,减少不必要的数据传输[^1]。 - **方法 2: 结合 grep 命令(灵活,但可能影响性能)** 如果设备或环境支持,直接通过管道过滤: ```bash adb logcat | grep <PID> ``` 示例: ```bash adb logcat | grep 4567 ``` 但注意:grep 会增加 CPU 开销,尤其在高日志量时可能延迟输出[^2]。 #### 步骤 3: 处理多个 PID 或自动化脚本 如果应用有多个进程(如后台服务),您需要捕获所有 PID 并组合过滤- **手动组合 PID**: 使用正则表达式通过 grep 匹配多个 PID: ```bash adb logcat | grep -E "PID1|PID2|PID3" ``` - **自动化脚本(推荐)**: 参考引用[3]的 Python 脚本,自动获取包名对应的所有 PID 并过滤日志: 1. 保存以下脚本为 `filter_logcat.py`: ```python import os import sys package_name = sys.argv[1] # 从命令行获取包名 # 获取所有相关 PID command = f"adb shell ps | grep {package_name}" pids = [] with os.popen(command) as process: for line in process: if line.strip(): pid = line.split()[1] # 提取 PID pids.append(pid) if pids: pid_filter = "|".join(pids) # 组合 PID 为正则表达式 os.system(f'adb logcat | grep -E "{pid_filter}"') else: print(f"No PID found for package: {package_name}") ``` 2. 运行脚本: ```bash python filter_logcat.py com.example.app ``` 此脚本简化了过程,并支持多进程应用[^3]。 #### 注意事项 - **性能建议**:优先使用 `--pid` 参数,因为它由 adb 直接处理,效率高于 grep。对于高频率日志,避免管道过滤以防卡顿[^1][^2]。 - **备选方案**: - **logcat 内置过滤**:虽然 logcat 支持基于 tag 和优先级过滤(例如 `adb logcat MyTag:I *:S`),但无法直接按包名过滤。详情见 [Android 官方文档](https://developer.android.com/studio/command-line/logcat)[^1]。 - **图形工具**:使用 DDMS 或 Android Studio 的 Logcat 工具,它们提供包名过滤的 GUI 界面,更直观[^1]。 - **确保设备连接**:运行命令前,确认 adb 设备已连接(`adb devices`)。 通过以上步骤,您可以高效地通过包名过滤特定 APK 的日志。如果遇到问题,请检查包名是否正确或应用是否在运行。 ### 相关问题 1. 如何过滤 adb logcat 中的特定 tag(标签)日志? 2. adb logcat 有哪些内置过滤选项,如何优化日志输出性能? 3. 如何将 adb logcat 输出保存到文件以便后续分析? 4. 当应用有多个进程时,如何处理日志过滤以避免遗漏?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值