过滤LogCat只能从我的应用程序在Android中的消息?

我观察到,当我使用Eclipse的Logcat和ADT for Android,我也得到了许多其他应用程序的消息。 有没有一种方法来过滤,只显示来自我自己的应用程序的消息。

软件包名称保证是唯一的,因此您可以使用Logfunction和标签作为软件包名称,然后按软件包名称进行过滤

注:从Build Tools 21.0.3开始,由于TAGS限制为23个字符或更less,这将不再起作用。

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的调用。

你可以在这里find所有的日志级别和更多信息: https : //developer.android.com/studio/command-line/logcat.html

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

编辑:看起来像我跳了一下枪,只是意识到你问日志在Eclipse中。 我上面发布的是从命令行通过adb使用logcat。 我不知道是否相同的filter转移到Eclipse。

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

 adb logcat | grep -F "`adb shell ps | grep com.example.package | cut -c10-15`" 

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

这匹配多个进程时也可以使用。

添加filter

添加过滤器

指定名称

在这里输入图像描述

select你的filter。

在这里输入图像描述

5月17日更新

已经有几年了,事情已经改变了。 Eclipse不再正式支持。 所以这里有两个更新的方法:

1. Android Studio

在这里输入图像描述Android monitor工具箱中,可以根据debuggable process来过滤logcat。 通常,当你开发一个应用程序时,它是一个可debugging的过程。 每隔一段时间,我都会遇到这个问题,并做以下工作:

  1. Tools – > Android – > Enable ADB Integration
    如果它已经启用,然后closures它,然后再打开

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

也有选项可以通过正则expression式和debugging级别进行过滤

2. logcat-color

如果你想使用基于terminal的解决scheme,这是一个很好的python封装在adb logcat之上。 关于它的好处是你可以保存多个configuration,并简单地重用它们。 按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。

对我来说,这在Mac Terminal工程
到达你有adb的文件夹,然后在terminal键入下面的命令

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

在这里它将过滤MyTAGAndroidRuntime所有日志

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

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

把这个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

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

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

编辑:我试图从命令行指定一个应用程序filter – 但没有运气。 如果有人知道这一点或如何停止自动滚屏,请让我知道。

如果您使用的是Android Studio ,则可以select要从中接收logcats的进程。 这是截图。

在这里输入图像描述

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

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

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

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

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

*这是jj_第一次提到,但花了我很长时间在评论中find它…

我不确定有一种方法只能看到有关您的应用程序的系统消息,但是您可以基于string进行过滤。 如果你正在程序中做一个日志,你可以只包含一个特定的关键字,并根据这个词进行过滤。

只需使用logcat内的filter即可。 有一个button可以让你添加filter。 只需指定应用程序ID,确保事后select,而且完成,很容易!

尝试:窗口 – >首选项 – > Android – > LogCat。 更改字段“显示logcat视图如果…”值“VERBOSE”。 它帮助了我。

如果您使用的是Eclipse ,请按下面的logCat窗口中的绿色+符号 ,并在“ 应用程序名称”框中input软件包名称(com.example.yourappname)。 另外,在“ filter名称”框中select任何名字,然后单击“确定”。 当您刚刚添加的filter是从logCat的左侧窗格中select时,您将只会看到与您的应用程序相关的消息。

给你的日志一个名字。 我叫我的“娃娃”。

在这里输入图像描述

在Android Studio中,转到Android->编辑filterconfiguration

在这里输入图像描述

然后input你给日志的名字。 在我的情况下,它被称为“娃娃”。 以下是您可以执行的filtertypes的一些示例。 您可以通过System.out,System.err,日志或软件包名称进行筛选:

在这里输入图像描述在这里输入图像描述在这里输入图像描述

使用-s

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

喜欢。

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

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

 adb logcat -s AlexeysActivity 

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

资源

除了Tom Mulcahy的回答之外,如果你想在Windows的控制台上通过PID过滤,你可以创build一个像这样的小batch file:

 @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% 

现在可以inputtag:nameofthetag或app:nameoftheapp来进行过滤,而不必在已保存的filter栏中添加新的filter

在intelliJ(也可能在eclipse中),你可以通过文本webview过滤logcat输出,所以它基本上打印phonegap产生的所有东西

我试图使用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" 

这可能是最简单的解决scheme。

在Tom Mulcahy的解决scheme之上,您可以进一步简化它,如下所示:

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

用法很简单,就像正常的别名一样。 只需在shell中input命令:

 logcat 

别名设置使得它很方便。 正则expression式使得它适用于多进程应用程序,假设你只关心主进程。

因为你可以为每个进程设置更多的别名。 或者使用hegazy的解决scheme。 🙂

另外,如果你想设置日志级别,那就是

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

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>]

这对我的USBdebugging工作:

  1. 连接设备并使用:

    adb shell

  2. 简单的使用logcat:

    logcat | grep com.youapp.packagename

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

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

最后的*:D过滤出debugging日志级别下面的所有消息,但是可以将其忽略。

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