过滤LogCat只能获取Android应用程序中的消息?

Vin*_*nod 318 android android-logcat

我观察到当我使用带有ADT for Android的Logcat时,我也会从许多其他应用程序中获取消息.有没有办法过滤这个,只显示来自我自己的应用程序的消息.

Tom*_*ahy 346

Linux和OS X.

使用ps/grep/cut来获取PID,然后使用该PID grep获取logcat条目.这是我使用的命令:

adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel  | tr -s [:space:] ' ' | cut -d' ' -f2`"
Run Code Online (Sandbox Code Playgroud)

(你可以进一步改进正则表达式,以避免包含相同数字的不相关日志行的理论问题,但它对我来说从来都不是问题)

这在匹配多个进程时也有效.

视窗

在Windows上,您可以:

adb logcat | findstr com.example.package
Run Code Online (Sandbox Code Playgroud)

  • 在Windows上,你可以这样做:`adb logcat | findstr com.example.package` (14认同)
  • 只是对你的答案进行微小的改动.我建议:```adb logcat | grep`adb shell ps | grep com.example.package | tr -s [:space:]''| cut -d'' - f2```` (8认同)
  • 有时 gc 会在释放内存时打印与进程的 pid 号相同的数字。这是另一个版本`adb logcat | grep \`adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'\`` (3认同)
  • @BTRNaidu:您可以安装Cygwin或使用git-bash(bash for windows) (2认同)

sha*_*net 247

包名称保证是唯一的,因此您可以使用Log带有标记的函数作为包名称,然后按包名称进行筛选:

注意:从Build Tools 21.0.3开始,这将不再有效,因为TAGS限制在23个字符以内.

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

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

-d表示实际设备并-e表示仿真器.如果运行的仿真器超过1个,则可以使用-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.我上面发布的是从命令行使用logcat到adb.我不确定相同的过滤器是否会转移到Eclipse中.

  • 此方法按标记过滤,而不是按应用过滤.汤姆的方法按应用过滤 (53认同)
  • 通过使用`logcat <your package name>:<log level>`,答案表明可以使用包名作为有效过滤器.我需要两次阅读答案以理解它实际上在说什么,因此我建议只需将第一行更改为"`logcat <tag>:<log level>`,其中`<tag>`可以是您的包名称你在`android.util.Log`中也用作标签 (15认同)
  • 我知道问题是关于eclipse,但我喜欢命令行并且总是将它用于logcat.还可以使用一些工具为输出着色,如http://jsharkey.org/blog/2009/04/22/modifying-the-android-logcat-stream-for-full-color-debugging/使它甚至有用 (10认同)
  • 答案没有回答问题;很多时候,您需要来自图书馆的消息,但无法更改标签。 (2认同)

ber*_*ium 52

添加过滤器

添加过滤器

指定名称

在此输入图像描述

选择你的过滤器.

在此输入图像描述

  • 如何使用logcat命令行执行此操作? (13认同)
  • 设计开发工具时,务必要精确,因为用户期望它是精确的。那是软件包名称,而不是应用程序名称。&gt; :( (2认同)

You*_*Kim 42

从Android 7.0开始,logcat具有--pid过滤器选项,并且pidof命令可用,请将com.example.app替换为您的包名.
(ubuntu终端/自Android 7.0以来)

adb logcat --pid=`adb shell pidof -s com.example.app`
Run Code Online (Sandbox Code Playgroud)

要么

adb logcat --pid=$(adb shell pidof -s com.example.app)
Run Code Online (Sandbox Code Playgroud)

有关pidof命令的更多信息:https://stackoverflow.com/a/15622698/7651532

  • 我尝试了所有 `grep` 和 `findstr` 选项,但它们只过滤具有某些值的日志,不包括大量消息。您的答案是真实的,显示有关该应用程序的所有日志,而不排除来自其他库的日志消息。这就像 Android Studio 当前的“仅显示选定的”过滤器。谢谢! (4认同)
  • 只要进程“com.example.app”正在运行,这两个命令就可以工作。但是,如果该进程未运行,则会显示错误消息。只是一个旁注,以避免意外。 (2认同)
  • @本·巴特沃斯:正确。当应用程序未运行时,它没有 PID。因此,键入上述命令可能会导致输出消息:pid out of range。 (2认同)
  • 如果设备上存在“pidof”。 (2认同)

dig*_*ark 18

adb logcat -e "package-name" 
Run Code Online (Sandbox Code Playgroud)

当仅过滤一个应用程序的行时,此功能非常有效。


Ind*_*ore 17

对我来说,这适用于mac Terminal
到你所在的文件夹,adb然后在终端输入以下命令

./adb logcat MyTAG:V AndroidRuntime:E *:S
Run Code Online (Sandbox Code Playgroud)

这将过滤的所有日志MyTAGAndroidRuntime

  • 1) Java 代码:`Log.d("MyTAG", "我是英雄"); Log.d("AndroidRunTime", "i am zero");` 2) 调试登录到 Android `$ adb -s RKSCWSOV5SAIEUSC shell;` 3) `$ logcat MyTAG:V AndroidRuntime:E *:S` 4) 现在它将显示 MyTAG 的详细信息和 AndroidRuntime 的错误 (2认同)

Pas*_*lis 13

5月17日更新

已经有几年了,情况发生了变化.并且不再正式支持Eclipse.所以这里有两个最新的方法:

1. Android Studio

在此输入图像描述Android monitor工具箱中,您可以过滤logcat per debuggable process.通常,在开发应用程序时,它是一个可调试的过程.每隔一段时间我就会遇到这个问题,并做以下事情:

  1. Tools- > Android- > Enable ADB Integration.
    如果已经启用,则将其关闭,然后重新打开

  2. 拔下并重新插入您的移动设备.

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

2. logcat-color

adb logcat如果你想使用基于终端的解决方案,这是一个很好的python包装器.它的好处是您可以保存多个配置并简单地重复使用它们.过滤tags是非常可靠的.您也可以过滤package以查看仅一个或多个应用的​​日志,但是logcat-color在启动应用之前就开始了.

旧答案:

我似乎无法评论以前的答案,所以我会发布一个新答案.这是对Tom Mulcahy的回答的评论,它显示了命令应该如何改变以便在大多数设备上工作,因为adb shell psPID列是可变的.

注意:以下命令适用于已连接许多设备的情况.所以device id需要.否则,你可以简单地省略括号'[',']'

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

adb [-s DEVICE_ID] shell ps | head -n 1
Run Code Online (Sandbox Code Playgroud)

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

2.然后键入以下内容:

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

只需将您记忆中的列放入PUT_COLUMN_HERE,例如$5

警告

每次重新运行应用程序时,都必须重新运行第二个命令,因为应用程序从操作系统获取新的PID.


wub*_*ubb 10

这在git bash中一直在为我工作:

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


Gav*_*iel 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}:"
Run Code Online (Sandbox Code Playgroud)

然后: applog.sh com.example.my.package


dmS*_*azi 7

如果您使用的是Android Studio,则可以选择要从中接收日志的过程.这是截图.

在此输入图像描述


kev*_*vin 7

我写了一个用于按包名过滤logcat的shell脚本,我认为它比使用更可靠

ps | grep com.example.package | cut -c10-15
Run Code Online (Sandbox Code Playgroud)

它使用/ proc/$ pid/cmdline找出实际的pid,然后在logcat上执行grep

https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a


Kri*_*Dev 7

使用-s

您应该使用自己的标签,请参阅: http://developer.android.com/reference/android/util/Log.html

喜欢。

Log.d("AlexeysActivity","what you want to log");
Run Code Online (Sandbox Code Playgroud)

然后当你想阅读日志时使用>

adb logcat -s AlexeysActivity
Run Code Online (Sandbox Code Playgroud)

这会过滤掉所有不使用相同标签的内容。

来源

  • 不要假设您正在编写代码。您可能关心来自库的消息,并且无法更改日志字符串。 (3认同)

Len*_*lva 7

这适用于USB调试:

  1. 连接设备并使用:

    adb shell

  2. 简单使用logcat:

    logcat | grep com.youapp.packagename

  • 这为我节省了很多时间和麻烦。非常简洁,切中要点。谢谢! (2认同)
  • 此命令不会显示应用程序中的所有 pid,而只会显示包含您的包名称的 logcat? (2认同)

Aar*_*ris 6

ADT v15 for Eclipse允许您指定应用程序名称(实际上是androidmanifest.xml中的包值).

我喜欢能够通过应用程序进行过滤,但新的logcat有自动滚动的错误.当您向上滚动一点以查看以前的日志时,它会在几秒钟内自动滚动回到底部.它似乎向上滚动日志的1/2向上确保它不会跳回到底部,但这通常是无用的.

编辑:我尝试从命令行指定一个应用程序过滤器 - 但没有运气.如果有人想出来或如何停止自动滚动,请告诉我.


rar*_*ass 6

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

*这是jj_首先提到的,但我在评论中花了很多时间才找到它...


Dee*_*tri 6

为了访问 logcats,您首先需要安装 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。

有关过滤 logcat 的更多信息,请阅读此内容

  • 它应该是“adb logcat --pid=&lt;pid&gt;”。你应该能够执行 `adb logcat --pid=$(adb shell pidof &lt;package name&gt;)` (2认同)

Tom*_*ahy 6

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

adb shell run-as my.package.name logcat
Run Code Online (Sandbox Code Playgroud)

run-as 不适用于不可调试的应用程序,因此对于那些我使用该--uid标志的应用程序。不幸的是没有 a 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" "$@"
}
Run Code Online (Sandbox Code Playgroud)

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

我更喜欢基于此的--pidof解决方案(请参阅/sf/answers/3360286051/),因为这需要您在每次重新启动进程时重新运行命令。


yoA*_*ex5 5

作为变体,您可以使用Jake Wharton 的第三方脚本PID Cat。这个脚本有两个主要优点:

  • 显示来自特定应用程序包的进程的日志条目
  • 彩色日志猫

从文档:

在应用程序开发期间,您通常只想显示来自应用程序的日志消息。不幸的是,由于每次部署到手机时进程 ID 都会发生变化,因此 grep 获取正确的内容是一项挑战。

此脚本通过按应用程序包过滤来解决该问题。

输出看起来像 在此处输入图片说明


小智 5

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