在Android中如何过滤LogCat以仅获取来自我的应用程序的消息?

474

我注意到当我在使用带有ADT的Eclipse的Logcat时,会收到来自许多其他应用程序的消息。有没有办法过滤这些消息,仅显示来自我的应用程序的消息。


1
所有的答案都建议过滤来自正在调试的应用程序的消息。即使打开了这些过滤器,来自其他应用程序的Logcat垃圾邮件很快就会填满日志缓冲区,无论它有多大。有没有办法告诉Eclipse根本不收集这些消息或定期删除它们? - Price
1
https://dev59.com/vFwY5IYBdhLWcg3wVGiB#32737594 - Alex P.
尝试使用这个CLI工具-它可以使过滤变得更加容易。https://github.com/kashifrazzaqui/punt - keios
38个回答

462
注意:以下答案已经超过10年了。可能不再是最好的答案。我目前更喜欢使用https://dev59.com/bmw15IYBdhLWcg3wD3jp#76551835这种方法来完成。
Linux和OS X
使用ps/grep/cut命令获取PID,然后使用grep命令查找具有该PID的logcat条目。这是我使用的命令:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel  | tr -s [:space:] ' ' | cut -d' ' -f2`"

(你可以进一步改进正则表达式,以避免不相关的日志行包含相同的数字的理论问题,但这对我来说从未成为问题)
(当匹配多个进程时,这也适用。)

Windows

(在Windows上,要获取完整的日志,可以执行以下操作:)
adb logcat | findstr com.example.package

Logcat日志有不同的级别来获取信息:
V — 冗长(Verbose),D — 调试(Debug),I — 信息(Info),W — 警告(Warning),E — 错误(Error),F — 致命(Fatal),S — 静默(Silent)
因此,要仅获取与应用程序相关的错误日志,您可以按照以下方式更新上述命令:
adb logcat *:E | findstr com.example.package

2
@BTRNaidu:你可以安装Cygwin或使用git-bash(Windows下的bash)。 - Phillip
3
有时候当空闲内存时,垃圾收集器会打印出进程的PID数字和相同的数字。这是另一个版本:adb logcat | grep \adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`` - alijandro
17
在Windows上,你可以执行以下操作:adb logcat | findstr com.example.package - Redoman
8
对你的回答做一个小修改。我建议使用以下命令:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2` - hiepnd
1
我的版本是这个 adb logcat | grep -i \adb shell ps | grep $1 | cut -c11-15`` 它在一个脚本中,我只需传入包名即可。 - David
显示剩余20条评论

327

包名是唯一的,因此您可以使用包名作为标记并按包名过滤来使用Log函数:

注意:自Build Tools 21.0.3版本开始,由于标签被限制在23个字符或更少,这将不再起作用。

Log.<log level>("<your package name>", "message");

adb -d logcat <your package name>:<log level> *:S

-d表示实际设备,-e表示模拟器。如果有多个模拟器正在运行,可以使用-s emulator-<emulator number>(例如,-s emulator-5558

示例:adb -d logcat com.example.example:I *:S

或者,如果您使用System.out.print将消息发送到日志,则可以使用adb -d logcat System.out:I *:S仅显示对System.out的调用。

您可以在此处找到所有日志级别和更多信息:https://developer.android.com/studio/command-line/logcat.html

http://developer.android.com/reference/android/util/Log.html

编辑:看起来我有些着急,并意识到您正在询问有关Eclipse中的logcat。 我上面发布的是通过命令行从adb使用logcat的方法。我不确定相同的过滤器是否转移到Eclipse。


11
我知道问题是关于日食的,但我热爱命令行,而且通常也会用命令行来查看logcat。此外,使用一些工具对输出进行颜色标记,例如http://jsharkey.org/blog/2009/04/22/modifying-the-android-logcat-stream-for-full-color-debugging/,可以使其更加实用。 - Francisco Jordano
1
在模拟器上测试:当我执行adb -e logcat com.example.example:I *:S时,它卡住了,但是adb -d logcat System.out:I *:S可以正常工作。 - CoDe
1
@Shubh,你说卡住了是什么意思?我发布这个帖子已经快一年了,所以Logcat中的某些内容可能已经发生了变化。 - shanet
64
这种方法是通过标签进行筛选,而不是通过应用程序。汤姆的方法是通过应用程序进行筛选。 - Jonas Alves
19
使用logcat <your package name>:<log level>命令可以将包名作为有效的筛选条件。为了更加易懂,建议将第一行改为"logcat <tag>:<log level>,其中<tag>可以是您在android.util.Log中使用的包名标签。" - Flow
显示剩余7条评论

189

自 Android 7.0 版本以后,logcat 工具提供了 --pid 过滤选项,并且 pidof 命令也可用,将 com.example.app 替换为您的包名即可。

adb logcat --pid=`adb shell pidof -s com.example.app`
或者
adb logcat --pid=$(adb shell pidof -s com.example.app)

更多关于pidof命令的信息:
https://dev59.com/EmUo5IYBdhLWcg3w_DpK#15622698


7
我尝试了所有的 grepfindstr 选项,但它们只能过滤出具有某个值的日志,排除了许多消息。你的答案是正确的,展示所有关于该应用程序的日志,而不排除来自其他库的日志消息。就像当前 Android Studio 的“仅显示已选择”的筛选器一样。谢谢! - equiman
4
只要进程“com.example.app”在运行,这两个命令就能正常工作。但是,如果该进程没有运行,错误消息将会出现。这只是一个小提示,以避免出现意外情况。 - jonathanzh
1
哦,我明白了,一个完全没有运行的应用程序是不会有 PID 的! - Ben Butterworth
2
@Ben Butterworth:正确。当应用程序未运行时,它没有PID。因此,键入上述命令可能会导致输出消息:pid超出范围。 - jonathanzh
2
如果设备上存在 pidof - vesperto
显示剩余4条评论

54

添加过滤器

添加过滤器

指定名称

输入图像说明

选择您的过滤器。

输入图像说明


6
设计开发工具时精确度非常重要,因为用户需要精确性。那是软件包名称,不是应用程序名称。 >:( - Henrik Erlandsson

51
这对我来说在启用USB调试时有效:
解决方案是直接通过shell使用您设备的logcat。
1. 连接设备并使用: adb shell
2. 在设置好shell之后使用logcat: logcat | grep com.yourapp.packagename

2
这节省了我很多时间和麻烦。非常简洁,直截了当。谢谢! - Altin
2
这个命令不会显示应用程序的所有pid,而只会显示logcat中包含您的包名称的内容? - Hunter
是的,这个基本上是一个文本过滤器,可以用于有关您的应用程序的系统日志,即使它没有运行也会很有用。如果您需要使用 PID 过滤器,请使用其他解决方案。 - Lennoard Silva

20

对我来说,在Mac上这个方法是可行的:终端
进入你存放 adb 的文件夹,然后在终端中输入以下命令

./adb logcat MyTAG:V AndroidRuntime:E *:S

这里将过滤所有MyTAGAndroidRuntime的日志。


2
  1. Java代码:Log.d("MyTAG", "我是英雄"); Log.d("AndroidRunTime", "我是零");
  2. 要调试登录到Android $ adb -s RKSCWSOV5SAIEUSC shell;
  3. $ logcat MyTAG:V AndroidRuntime:E *:S
  4. 现在它将显示MyTAG的详细信息和AndroidRuntime的错误。
- user285594
1
这是在MacOS上唯一对我有效的答案。干得好。 - om-ha
1
@om-ha 谢谢,我很久以前使用过 Studio,不知道它仍然存在这个问题。 - Inder Kumar Rathore
1
事实上,我并没有使用Android Studio。 我使用Flutter、Android SDK和Gradle。 作为编辑器,我使用VS Code。 因此,这是了解我的安卓手机正在发生什么的绝佳方式。 - om-ha

14
adb logcat -e "package-name" 

这在仅筛选一个应用程序的行时完美运作。

13

更新于5月17日

已经过了几年,情况已经改变,Eclipse不再得到官方支持。因此这里提供两种更加实用的方法:

1. Android Studio

输入图像描述Android 监视器工具箱中,您可以按可调试进程筛选logcat。通常情况下,在开发应用程序时,它是一个可调试进程。偶尔会遇到问题,这时可以尝试以下步骤:

  1. 工具 -> Android -> 启用ADB集成.
    如果已经启用,则切换关闭,然后再次打开

  2. 拔掉并重新插入您的手机设备。

还有通过正则表达式和调试级别进行筛选的选项。

2. logcat-color

如果您想使用基于终端的解决方案,这是一个很好的python封装。它的好处在于您可以保存多个配置并简单地重复使用它们。按标签筛选相当可靠。您也可以按包名进行过滤,只查看一个或多个应用程序的日志,但必须在启动应用程序之前启动logcat-color

旧的回答:

看起来我不能评论以前的答案,所以我将发布一个新的。 这是对Tom Mulcahy的答案的评论,显示命令应如何更改才能在大多数设备上运行,因为adb shell ps PID列是可变的。

注意:下面的命令适用于您连接了许多设备的情况。因此需要设备ID。否则,您可以简单地省略方括号 '[', ']'

1. 要找出pid列,请键入:

adb [-s DEVICE_ID] shell ps | head -n 1

现在记住 PID 的列数。编号从 1 开始。

2. 然后输入以下内容:

adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')

只需将你记住的列放在PUT_COLUMN_HERE,例如$5

注意

每次重新运行应用程序时,你都需要重新运行第二条命令,因为应用程序从操作系统获得新的PID。


看看你必须做的所有事情,只是为了获取应用程序的日志,而不是其他应用程序。此外,我真的觉得其他人可以看到其他人的日志非常荒谬。你是在告诉我Google无能为力吗?只需确保我的日志不被其他人看到,并保持我的logcat干净即可。 - TatiOverflow

12

Ubuntu : adb logcat -b all -v color --pid=`adb shell pidof -s com.packagename` 带有颜色和应用程序的持续日志输出


“adb shell pidof…” 这一部分对我没用,所以我使用了“adb shell”进入设备并运行了“top”命令,复制了我的应用程序的PID,并将其替换到你的命令中。 - edzillion
尝试使用 pgrep 而不是 pidof - Lennoard Silva
这对我在OSX上有效,如果有-v颜色则额外加分。 - Mars

11

这对我在 Git Bash 中运作良好:

$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接