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

我观察到,当我使用Logcat Eclipse ADT for Android时,我也从许多其他应用程序获得消息。是否有一种方法来过滤这个,只显示来自我自己的应用程序的消息。

486601 次浏览

我不确定是否有一种方法只能看到关于你的应用程序的系统消息,但你可以基于字符串进行过滤。如果在程序中执行日志,则可以只包含某个惟一的关键字,并基于该关键字进行筛选。

包名被保证是唯一的,所以你可以使用带有标记的Log函数作为包名,然后根据包名进行筛选:

注意:从构建工具21.0.3开始,这将不再有效,因为标签被限制为23个字符或更少。

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

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

-d表示实际设备,-e表示模拟器。如果有多个模拟器在运行,你可以使用-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 < a href = " http://developer.android.com/reference/android/util/Log.html " > < / >

编辑:看起来我有点操之过急了,刚刚才意识到您在问Eclipse中的logcat。我上面发布的是如何从命令行通过adb使用logcat。我不确定相同的过滤器是否可以转移到Eclipse中。

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

我喜欢通过应用程序进行过滤,但新的logcat在自动滚动方面有一个bug。当您向上滚动一点以查看以前的日志时,它会在几秒钟内自动滚动回底部。在日志中向上滚动1/2的位置似乎可以防止它跳回底部,但这通常是无用的。

编辑:我试着从命令行指定一个应用程序过滤器——但运气不好。如果有人解决了这个问题或者如何停止自动滚动,请告诉我。

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

5月17日更新

几年过去了,情况变了。Eclipse也不再受官方支持。这里有两种最新的方法:

1. Android工作室

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

  1. Tools -> Android -> Enable ADB Integration。< BR > 如果已经启用,则将其关闭,然后返回

  2. 拔下移动设备的电源插头。

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

2. logcat-color

如果你想使用基于终端的解决方案,这是adb logcat之上的一个漂亮的python包装器。这样做的好处是您可以保存多个配置并简单地重用它们。通过tags进行过滤是相当可靠的。你也可以通过package进行过滤,只查看一个或多个应用程序的日志,但你要在启动应用程序之前启动logcat-color

旧的回答:

似乎我不能评论之前的答案,所以我会发布一个新的。 这是对汤姆·马尔卡希的回答的注释,它显示了该命令应该如何更改以便在大多数设备上工作,因为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。

尝试:Window -> Preferences -> Android -> LogCat。修改字段“如果…显示logcat视图”的值为“VERBOSE”。它帮助了我。

如果你正在使用Eclipse,按下下面logCat窗口中的绿色+号,并将你的包名(com.example.yourappname)放在按应用名称框中。另外,在过滤器的名字框中选择任何你觉得舒服的名称,然后单击确定。当从logCat的左窗格中选择刚才添加的筛选器时,您将只看到与应用程序相关的消息。

添加过滤器

Add filter

指定名称

enter image description here

选择你的过滤器。

enter image description here

如果你正在使用Android工作室,你可以选择从中接收logcats的进程。 下面是屏幕截图

enter image description here

这已经为我工作在git bash:

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

现在可以输入tag:nameofthetag或app:nameoftheapp来过滤,而不需要在保存的过滤器栏中添加新的过滤器

对我来说,这在mac Terminal
中工作 找到你有adb的文件夹,然后在终端

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

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

我写了一个shell脚本,通过包名过滤logcat,我认为这比使用更可靠

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

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

https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a < a href = " https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a " > < / >

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

把这个放到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}:"
< p >: applog.sh com.example.my.package < / p >

为您的日志命名。我叫我的“娃娃儿”。

enter image description here

在Android Studio中,进入Android->编辑过滤器配置

enter image description here

然后输入给日志的名称。对我来说,它叫“娃娃儿”。下面是一些可以使用的过滤器类型的示例。您可以通过系统进行过滤。,系统。err,日志或包名:

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

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

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

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

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

使用方便,如普通别名。只需在shell中输入命令:

logcat

别名设置非常方便。regex使它对于多进程应用程序非常健壮,假设你只关心主进程。

因为您可以根据需要为每个进程设置更多的别名。或者用hegazy的解。:)

此外,如果您想设置日志级别,它是

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

使用-s !

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

喜欢的。

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

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

adb logcat -s AlexeysActivity

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

< a href = " https://stackoverflow.com/a/7537430/2227298 " > < / >来源

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

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

这适用于我的USB调试:

解决方案是直接通过shell使用你的设备自己的日志

  1. 连接设备并使用:

    adb shell

  2. shell建立后使用logcat:

    logcat | grep com.yourapp.packagename

除了汤姆·马尔卡希的答案之外,如果你想在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%

这显然是一个针对从开发人员设备的使用Logcat的问题,然而,如果你想(以编程方式)显示设备的Logcat输出,你只需要这个:

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

*:D在结束时过滤掉Debug日志级别以下的所有消息,但你可以省略它。

例如,要将输出指向TextView,请参见在这里

在Windows 10上,使用Ionic,对我来说最有效的是将“findstr”与所有应用程序消息生成的“INFO:CONSOLE”结合起来。 因此,我在命令行中的命令是:

adb logcat | findstr INFO:CONSOLE

从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 < / p >

应用程序消息

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

  • 显示来自特定应用程序包的进程的日志项
  • 颜色logcat

从文档:

在应用程序开发过程中,您通常希望只显示来自应用程序的日志消息。不幸的是,由于进程ID在每次部署到手机时都会更改,这对grep进行正确的操作是一个挑战。

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

输出如下 enter image description here < / p >

在linux中,这对我来说是有效的:

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

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

对于windows,你可以使用我的PowerShell脚本只为你的应用程序显示消息: https://github.com/AlShevelev/power_shell_logcat < / p >

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

Adb logcat com.example。myapp: V *: S

另外,如果你已经推出了你的应用程序,你想从发布的应用程序中获取错误日志,你可以使用以下命令。

adb logcat AndroidRuntime:E *:S

为了访问日志,首先需要安装ADB命令行工具。ADB命令行工具是android studio平台工具的一部分,可以从在这里下载。在此之后,您需要为adb工具设置路径/环境变量。现在您可以从eclipse终端/ intellij终端或mac终端(如果您使用的是macbook)访问logcat。

adb logcat:获取整个logcat。

adb shell pidof 'com.example.debug':获取应用程序的进程id。

adb logcat pid=<pid>:获取特定于应用程序的logcat。

adb logcat pid=<pid>|grep 'sometext':根据一些文本过滤logcat。

有关过滤logcats的更多信息,请阅读

我通常会在日志消息中添加一些内容以使其与众不同。或者以unity app为例,你可以使用“Unity"作为匹配字符串。

对于mac:

adb logcat | grep "MyUniqueString"

Windows (powershell):

adb logcat | Select-String "MyUniqueString"

我有不同的方法,你可以尝试访问本地设备的shell。

adb shell

然后是

logcat | grep com.package.name

这个印刷品里都有那个包裹。

或者,你可以尝试flutter logs --verbose

当你在shell内部时,获取确切包名日志的另一种方法:

logcat --pid $(ps -ef | grep -E "com.example.app\$" | awk '{print $2}')
adb logcat -e "appname"

这工作时,过滤行只有一个应用程序。

Windows CMD

例如,如果您的应用程序包名称为:< >强com.nader.chat < / >强

cd C:\Users\[your-username]\AppData\Local\Android\Sdk\platform-tools
adb shell logcat *:E | findstr /c:"at com.nader.chat"

enter image description here

  • E:只是从日志中过滤错误,你可以用V: Verbose(最低优先级)<强> D < / >强:调试<强> < / >强:信息<强> W < / >强:警告< >强F < / >强:致命的替换它。
  • 查找错误只是在你写的源代码,而不是其他相关模块