筛选LogCat以仅从Android中的“我的应用程序”中获取消息?


340

我观察到,当我将Logcat与Eclipse和Android的ADT结合使用时,我也从许多其他应用程序中获取消息。有没有一种方法可以对此进行过滤,并且仅显示来自我自己的应用程序的消息。


1
所有答案都建议过滤来自正在调试的应用程序的消息。即使启用了这些过滤器,来自其他应用程序的Logcat垃圾邮件也很快填充了日志缓冲区,无论它有多大。有没有办法告诉Eclipse根本不收集这些消息或保持定期删除它们?
价格

Answers:


267

包名称保证是唯一的,因此您可以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。我上面发布的内容是用于通过命令行通过adb使用logcat。我不确定是否将相同的过滤器转移到Eclipse中。


10
我知道问题是关于Eclipse的,但是我爱上了命令行,也总是将它用于logcat。还可以使用一些工具为输出着色,例如jsharkey.org/blog/2009/04/22/…使其变得很有用
Francisco Jordano

1
在模拟器上进行测试:当我执行adb -e logcat com.example.example:I *:S,adb -d logcat System.out:I *:S时,它对我来说是卡住的。
CoDe12 2012年

1
@Shubh这是什么意思?我在大约一年前发布了这篇文章,因此从那时起,Logcat中的某些内容可能已经发生了变化。
shanet 2012年

58
此方法按标签而不是应用过滤。汤姆的方法由应用程序过滤
乔纳斯·阿尔维斯

17
通过使用logcat <your package name>:<log level>答案,可以将包名称用作有效的过滤器。我需要阅读的答案两次来理解它实际上是在说,因此,我建议干脆第一行更改为类似“ logcat <tag>:<log level>这里<tag>可以成为你的包名,如果你在还用作标签android.util.Log
流量

367

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上,您可以执行以下操作:

adb logcat | findstr com.example.package

2
@BTRNaidu:您可以安装Cygwin或使用git-bash(适用于Windows的bash)
Phillip

1
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale 2014年

1
释放内存时,somtimes gc将与进程的pid号打印相同的数字。这是另一个版本adb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro

14
在Windows上,您可以执行以下操作:adb logcat | findstr com.example.package
jj_ 2015年

8
只是对您的答案进行了微小的更改。我建议:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd

59

从Android 7.0开始,logcat具有--pid筛选器选项,并且pidof命令可用,请将com.example.app替换为您的程序包名称。
(Ubuntu终端/自Android 7.0起)

adb logcat --pid=`adb shell pidof -s com.example.app`

要么

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

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


2
我尝试了所有grepand findstr选项,但它们仅过滤具有某些值的日志,但不包括很多消息。您的答案是真实的答案,显示有关该应用程序的所有日志,而不排除来自其他库的日志消息。就像Android Studio当前的“仅显示所选内容”过滤器一样。谢谢!
Equiman

只要进程“ com.example.app”正在运行,这两个命令就起作用。但是,如果进程未运行,将显示错误消息。只是旁注,以免引起意外。
jonathanzh

53

添加过滤器

添加过滤器

指定名称

在此处输入图片说明

选择您的过滤器。

在此处输入图片说明


3
设计开发工具时,务必要精确,因为用户期望它是精确的。那是软件包名称,而不是应用程序名称。> :(
亨里克·埃兰森

19

对我来说,这在Mac中有效Terminal
转到您所在的文件夹,adb然后在终端中键入以下命令

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

这将过滤的所有日志MyTAGAndroidRuntime


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

1
这是在MacOS上对我有用的唯一答案。做得好。
om-ha

1
@ om-ha谢谢,我使用Studio很久了,不知道它仍然有问题
Inder Kumar Rathore

1
实际上,我没有使用Android Studio。我正在使用Flutter,Android SDK和Gradle。作为编辑,VS Code。因此,这是一种了解我的android手机中正在发生什么情况的极好方法
om-ha

13

5月17日更新

已经过了几年了,事情发生了变化。而且Eclipse不再受正式支持。因此,这里还有两种最新的方法:

1. Android Studio

在此处输入图片说明Android monitor工具箱中,您可以按过滤logcat 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

现在记住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

10

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

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

是否可以在android代码中使用它?
niko1312

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}:"

然后: 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

9

这适用于我的USB调试:

  1. 连接设备并使用:

    adb shell

  2. 连接后使用logcat:

    logcat | grep com.yourapp.packagename


7

如果您使用的是Android Studio,则可以选择要接收日志记录的过程。这是屏幕截图。

在此处输入图片说明


1
从Android Studio版本0.4.5开始,您将从仅运行的应用程序中获取消息。 Log cat has a new option (on by default) which creates an application filter automatically such that only the launched application's output is shown
dmSherazi 2014年


6

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

我喜欢能够按应用进行过滤,但是新的logcat的自动滚动功能存在错误。当您向上滚动一点以查看以前的日志时,它会在几秒钟内自动滚动回到底部。似乎将日志向上滚动1/2确实可以防止它跳回到底部,但这通常没用。

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


6

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

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


6

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

4

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

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

从文档:

在应用程序开发期间,您通常只希望显示来自您的应用程序的日志消息。不幸的是,由于进程ID每次部署到电话时都会更改,因此对grep进行正确处理就成为了挑战。

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

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


2

我不确定是否有办法只查看有关您的应用的系统消息,但是您可以基于字符串进行过滤。如果要在程序中进行日志记录,则可以仅包含某个唯一关键字,然后根据该单词进行过滤。



2

如果您使用的是Eclipse,请在下面的logCat窗口中按绿色+号,然后在“ 按应用程序名称”框中输入您的软件包名称(com.example.yourappname)。另外,在“ 过滤器名称”框中选择适合您的名称,然后单击“确定”。从logCat的左窗格中选择刚添加的过滤器时,您将仅看到与您的应用程序相关的消息。


2

给您的日志起一个名字。我称我为“ wawa”。

在此处输入图片说明

在Android Studio中,转到Android->编辑过滤器配置

在此处输入图片说明

然后输入您给日志的名称。就我而言,它称为“ wawa”。以下是一些您可以执行的过滤器类型的示例。您可以按System.out,System.err,日志或程序包名称进行过滤:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


2

这可能是最简单的解决方案。

除了Tom Mulcahy的解决方案之外,您还可以像下面这样进一步简化它:

alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"

用法很容易作为普通别名。只需在您的shell中键入命令:

logcat

别名设置非常方便。假设您只关心主流程,则正则表达式使其对于多进程应用程序具有强大的功能。

在coz中,您可以根据需要为每个进程设置更多别名。或使用hegazy的解决方案。:)

另外,如果要设置日志记录级别,则可以

alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"

2

在Windows 10上,使用Ionic,最有效的方法是将'findstr'与所有App消息生成的“ INFO:CONSOLE”结合使用。因此,我在命令行中的命令是:

adb logcat | findstr INFO:CONSOLE

1

我尝试使用Tom Mulcahy的答案,但不幸的是,它不适用于具有多个进程的应用程序,因此我对其进行了编辑以满足自己的需求。

#!/bin/bash
if [ "$#" -ne 1 ]; then echo "Illegal number of parameters"; exit 1; fi
echo "Lof for package name: $1"
PROCESSES=`adb shell ps | grep "$1" | cut -c10-15`
NUM_OF_PROCESSES=`echo "$PROCESSES" | wc -l`
if [ $NUM_OF_PROCESSES -eq 0 ]; then echo "The application is not running!"; exit 1; fi
COUNTER=1
for process in $PROCESSES; do
        if [ $COUNTER -eq 1 ]; then GREP_TEXT="("; fi
        GREP_TEXT+=$process
        if [ $COUNTER -eq $NUM_OF_PROCESSES ]; then GREP_TEXT+=")"; else GREP_TEXT+="|"; fi
        let COUNTER=COUNTER+1 
        if [ $COUNTER -gt $NUM_OF_PROCESSES ]; then break; fi  
done
adb logcat | grep -E "$GREP_TEXT"


1

除了Tom Mulcahy的答案之外,如果要在Windows的控制台上按PID进行过滤,还可以创建一个小的批处理文件,如下所示:

@ECHO OFF

:: find the process id of our app (2nd token)
FOR /F "tokens=1-2" %%A IN ('adb shell ps ^| findstr com.example.my.package') DO SET PID=%%B

:: run logcat and filter the output by PID
adb logcat | findstr %PID%

1

显然,这是一个针对从开发人员设备外部使用Logcat的问题,但是,如果要在设备上(以编程方式)显示Logcat输出则只需要这样做:

Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");

*:D在最后筛选出以下调试日志级别,每封邮件,但你可以离开了这一点。

要将输出定向到例如TextView,请参见此处的示例。


0

现在可以键入tag:nameofthetag或app:nameoftheapp进行过滤,而无需向保存的过滤器栏中添加新过滤器



0

Gavriel的另一种变体,applog.sh支持具有多个过程的多个设备和应用程序:

#!/bin/sh
PKG=$1
shift

APPIDS=`adb $@ shell ps | awk -v PKG="$PKG" '
    (NR == 1){appcolumn=2; for (i=1; i<=NF; i++) if ($i=="PID") {appcolumn=i}}
    index($0,PKG){print $(appcolumn)}' | paste -d \| -s`

echo "PID's: $APPIDS"
adb $@ logcat -v color | awk  "(\$3 ~ /$APPIDS/){print \$0}"

用法: applog.sh com.example.my.package [-s <specific device>]


-1

在linux中,这对我有用:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.