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

时间:2011-07-28 04:34:21

标签: android android-logcat

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

33 个答案:

答案 0 :(得分:330)

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`"

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

这在匹配多个流程时也有效。

在Windows上,您可以执行以下操作:

adb logcat | findstr com.example.package

答案 1 :(得分:225)

包名称保证是唯一的,因此您可以使用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中。

答案 2 :(得分:50)

添加过滤器

Add filter

指定名称

enter image description here

选择过滤器。

enter image description here

答案 3 :(得分:26)

自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

答案 4 :(得分:17)

对我来说,这适用于mac Terminal
到达您拥有adb的文件夹,然后在终端

中键入以下命令
./adb logcat MyTAG:V AndroidRuntime:E *:S

此处它将过滤MyTAGAndroidRuntime

的所有日志

答案 5 :(得分:13)

5月17日更新

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

1。 Android Studio

enter image description hereAndroid monitor工具箱中,您可以按debuggable process过滤logcat。通常,在开发应用程序时,它是一个可调试的过程。每隔一段时间我就会遇到这个问题,并做以下事情:

  1. Tools - &gt; Android - &gt; Enable ADB Integration
    如果它已经启用,则将其关闭,然后重新启用

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

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

    2。 logcat-color

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

    旧答案:

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

    注意:以下命令适用于已连接多台设备的情况。所以需要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。

答案 6 :(得分:10)

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

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

答案 7 :(得分: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

答案 8 :(得分:7)

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

更可靠
ps | grep com.example.package | cut -c10-15

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

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

答案 9 :(得分:6)

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

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

答案 10 :(得分:6)

这适用于USB调试:

  1. 连接设备并使用:

    adb shell

  2. 简单使用logcat:

    logcat | grep com.youapp.packagename

答案 11 :(得分:6)

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

enter image description here

答案 12 :(得分:6)

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

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

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

答案 13 :(得分:3)

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

答案 14 :(得分:2)

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

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

摘自文档:

  

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

     

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

输出看起来像 enter image description here

答案 15 :(得分:2)

在Windows 10上,使用Ionic,对我有用的是将“findstr”与所有App消息生成的“INFO:CONSOLE”结合起来。 所以,我在命令行中的命令是:

adb logcat | findstr INFO:CONSOLE

答案 16 :(得分:2)

我不确定是否只能查看有关您应用的系统消息,但您可以根据字符串进行过滤。如果您在程序中进行日志记录,则可以只包含一个特定的关键字,并根据该字词进行过滤。

答案 17 :(得分:2)

为了访问 logcat,您首先需要安装 ADB 命令行工具。 ADB 命令行工具是 android studio 平台工具的一部分,可以从 here 下载。在此之后,您需要为 adb 工具设置路径/环境 variable。现在,如果您使用的是 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 的更多信息,请阅读 this

答案 18 :(得分:2)

为您的日志命名。我打电话给我&#34; wawa&#34;。

enter image description here

在Android Studio中,转到Android-&gt;编辑过滤器配置

enter image description here

然后输入您提供日志的名称。就我而言,它被称为&#34; wawa&#34;。以下是您可以执行的过滤器类型的一些示例。您可以按System.out,System.err,Logs或包名称进行筛选:

enter image description here enter image description here enter image description here

答案 19 :(得分:2)

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

答案 20 :(得分:2)

尝试:窗口 - &gt;偏好 - &gt; Android - &gt; logcat的。更改字段“显示logcat视图if ...”值“VERBOSE”。它帮助了我。

答案 21 :(得分:2)

只需使用logcat中的过滤器即可。那里有一个按钮,可以添加过滤器。只需指定应用程序ID,确保之后选择它,您就完成了,轻松!

答案 22 :(得分:1)

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

除了Tom Mulcahy的解决方案之外,您还可以进一步简化它,如下所示:

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

使用方法与普通别名一样简单。只需在shell中输入命令:

logcat

别名设置使它变得更方便。正则表达式使得它对多进程应用程序具有可靠性,假设您只关心主进程。

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

此外,如果要设置日志记录级别,则为

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

答案 23 :(得分:1)

使用-s

  

你应该使用自己的标签,看看:   http://developer.android.com/reference/android/util/Log.html

     

像。

Log.d("AlexeysActivity","what you want to log");
     

然后当你想阅读日志时使用&gt;

adb logcat -s AlexeysActivity
     

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

Source

答案 24 :(得分: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"

答案 25 :(得分: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%

答案 26 :(得分:1)

您可以使用以下命令为应用程序包获取详细日志

adb logcat com.example.myapp:V *:S

如果您已经推出了应用程序,并且想要从已发布的应用程序中获取错误日志,则可以使用以下命令。

adb logcat AndroidRuntime:E *:S

答案 27 :(得分: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>]

答案 28 :(得分:0)

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

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

最后的*:D过滤掉调试日志级别以下的每条消息,但您可以将其保留。

要将输出定向到TextView,请参阅示例here

答案 29 :(得分:0)

在intelliJ(也可能在eclipse中),您可以通过文本 webview 过滤logcat输出,因此它基本上打印了phonegap正在生成的所有内容

答案 30 :(得分:0)

现在可以输入tag:nameofthetag或app:nameoftheapp进行过滤而不向已保存的过滤器栏添加新过滤器

答案 31 :(得分:0)

对于Windows,您可以使用我的PowerShell脚本仅显示应用程序的消息: https://github.com/AlShevelev/power_shell_logcat

答案 32 :(得分:-1)

在linux中,这对我有用:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`