在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个回答

9

将此内容添加到 applog.sh 文件中。

#!/bin/sh
PACKAGE=$1
APPPID=`adb -d shell ps | grep "${PACKAGE}" | cut -c10-15 | sed -e 's/ //g'`
adb -d logcat -v long \
 | tr -d '\r' | sed -e '/^\[.*\]/ {N; s/\n/ /}' | grep -v '^$' \
 | grep " ${APPPID}:"

then: applog.sh com.example.my.package


这是捕获多行日志的过滤器变体(例如,如果您执行了log.d("TAG", "multine\nlog")):adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/{N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e '}' | grep -v '^$' - 我省略了 tr ,假定在Windows系统上需要它,并将 APPID 用括号括起来以允许多个PID(由 | 分隔)。 - Logan Pickup

8

使用Windows命令提示符:adb logcat -d | findstr <package>

*这最初是由jj_提到的,但我花了很长时间才在评论中找到它...


7
如果您正在使用Android Studio,您可以选择要接收logcat的进程。请参见以下截图。

1
从Android Studio版本0.4.5开始,您将仅收到正在运行的应用程序发送的消息。Logcat有一个新选项(默认情况下打开),它会自动创建一个应用程序过滤器,以便仅显示启动的应用程序的输出。 - dmSherazi

7

3
不要假设你在编写代码。你可能会关心来自库的信息,但你无法更改日志字符串。 - James Moore

7

我编写了一个用于按包名过滤logcat的shell脚本,我认为这比使用<grep>更可靠。

ps | grep com.example.package | cut -c10-15

它使用/proc/$pid/cmdline来查找实际pid,然后在logcat上进行grep。您可以参考此链接:https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a

6

LogCat应用程序消息

作为一种选择,您可以使用Jake Wharton的第三方脚本PID Cat。该脚本具有两个主要优点:

  • 显示特定应用程序包中进程的日志条目
  • 着色logcat

从文件的文档中得知:

在应用程序开发期间,您经常只想显示来自您的应用程序的日志消息。不幸的是,由于每次在手机上部署时过程ID都会更改,因此很难grep到正确的内容。

这个脚本通过按应用程序包进行过滤来解决这个问题。

输出看起来像这样enter image description here


6
ADT v15 for Eclipse允许您指定应用程序名称(实际上是androidmanifest.xml中的包值)。
我喜欢按应用程序筛选,但新的logcat有一个自动滚动的bug。当您向上滚动一点以查看以前的日志时,它会在几秒钟内自动滚动回底部。似乎将日志滚动到一半可以防止其跳回底部,但这通常是无用的。
编辑:我尝试从命令行指定应用程序筛选器,但没有运气。如果有人找出了如何解决这个问题或停止自动滚动,请告诉我。

5
为了访问日志记录,您首先需要安装ADB命令行工具。 ADB命令行工具是Android Studio平台工具的一部分,可以从这里下载。之后,您需要为adb工具设置路径/环境变量。现在,如果您使用的是MacBook,则可以从Eclipse终端/IntelliJ终端或Mac终端访问logcat。 adb logcat:获取整个logcat。 adb shell pidof 'com.example.debug':获取您的应用程序的进程ID。 adb logcat pid=<pid>:获取特定于您的应用程序的logcat。 adb logcat pid=<pid>|grep 'sometext':基于某些文本过滤logcat。
有关过滤日志记录的更多信息,请阅读此文档

1
这个答案应该是可行的,但对我来说却不起作用。 logcat 只是不断地输出每个应用程序的每个日志消息。 - Slbox
1
应该使用以下命令:adb logcat --pid=<pid>。你也可以使用以下命令:adb logcat --pid=$(adb shell pidof <package name>)。 - takecare

4

对于一个可调试的应用程序,我建议

adb shell run-as my.package.name logcat

run-as对于非可调试的应用程序无效,所以对于这些应用程序,我使用--uid标志。不幸的是,没有uidof,所以我需要从pm中提取它。以下是一个小的sh脚本来完成这个任务:
function logcat {
  pkg="$1"
  shift
  if [ -z "$pkg" ]; then
    >&2 echo 'Usage: logcat pkg ...'
    return 1
  fi

  uid="$(adb shell pm list package -U $pkg | sed 's/.*uid://')"
  if [ -z "$uid" ]; then
    >&2 echo "pkg '$pkg' not found"
    return 1
  fi

  adb logcat --uid="$uid" "$@"
}

使用方法是logcat my.package.name。它接受像普通 logcat 一样的额外参数。

我更喜欢这种基于--pidof的解决方案(参见https://dev59.com/bmw15IYBdhLWcg3wD3jp#48004086),因为那需要您每次重新启动进程时都重新运行命令。


3

我通常会在日志消息中添加一些内容,使其与其他消息区分开来。例如,在Unity应用程序中,您可以使用“Unity”作为匹配字符串。

对于Mac:

adb logcat | grep "MyUniqueString" 

对于Windows(PowerShell):

adb logcat | Select-String "MyUniqueString"

grep 的实现帮了很大的忙! - Chaki_Black

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