我观察到,当我将 Logcat 与 Eclipse 和 ADT for Android 一起使用时,我也会从许多其他应用程序中获取消息。有没有办法过滤这个并只显示来自我自己的应用程序的消息。
35 回答
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
包名称保证是唯一的,因此您可以使用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 中。
从 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
添加过滤器
指定名称
选择您的过滤器。
这适用于我的 USB 调试:
解决方案是直接通过 shell使用您设备自己的 logcat 。
连接设备并使用:
adb shell
设置 shell 后使用 logcat:
logcat | grep com.yourapp.packagename
对我来说,这适用于 macTerminal
进入文件夹,adb
然后在终端中键入以下命令
./adb logcat MyTAG:V AndroidRuntime:E *:S
在这里它将过滤所有日志MyTAG
和AndroidRuntime
5月17日更新
几年过去了,情况发生了变化。并且 Eclipse 不再受到官方支持。所以这里有两种最新的方法:
1.安卓工作室
在Android monitor
工具箱中,您可以根据debuggable process
. 通常,当您开发应用程序时,它是一个可调试的过程。每隔一段时间我就会遇到这个问题,并执行以下操作:
Tools
->Android
->Enable ADB Integration
。
如果已启用,则将其关闭,然后重新打开拔下并重新插入您的移动设备。
还有通过正则表达式和调试级别进行过滤的选项
2.logcat-颜色
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。
这一直在 git bash 中为我工作:
$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
Ubuntu : adb logcat -b all -v color --pid=`adb shell pidof -s com.packagename`带有颜色和应用程序的连续日志
把它放到 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
我写了一个shell脚本,用于通过包名过滤logcat,我认为比使用更可靠
ps | grep com.example.package | cut -c10-15
它使用 /proc/$pid/cmdline 找出实际的 pid,然后在 logcat 上执行 grep
如果您使用的是Android Studio,则可以选择要从中接收 logcat 的进程。这是屏幕截图。
使用-s
!
你应该使用自己的标签,看看:http: //developer.android.com/reference/android/util/Log.html
喜欢。
Log.d("AlexeysActivity","what you want to log");
然后当你想阅读日志时使用>
adb logcat -s AlexeysActivity
这会过滤掉所有不使用相同标签的东西。
使用 Windows 命令提示符:adb logcat -d | findstr <package>
.
*这是jj_最先提到的,但我花了很长时间才在评论中找到它......
ADT v15 for Eclipse 允许您指定应用程序名称(实际上是您的 androidmanifest.xml 中的包值)。
我喜欢能够按应用过滤,但是新的 logcat 有一个自动滚动的错误。当您向上滚动一点查看以前的日志时,它会在几秒钟内自动滚动回底部。似乎将日志向上滚动 1/2 确实可以防止它跳回底部,但这通常是无用的。
编辑:我尝试从命令行指定一个应用过滤器——但没有运气。如果有人弄清楚这一点或如何停止自动滚动,请告诉我。
As a variant you can use third party script PID Cat by Jake Wharton. This script has two major advantages:
- shows log entries for processes from a specific application package
- color logcat
From documentation:
During application development you often want to only display log messages coming from your app. Unfortunately, because the process ID changes every time you deploy to the phone it becomes a challenge to grep for the right thing.
This script solves that problem by filtering by application package.
在 Windows 10 上,使用 Ionic,对我有用的是将“findstr”与所有 App 消息生成的“INFO:CONSOLE”结合起来。所以,我在命令行中的命令是:
adb logcat | findstr INFO:CONSOLE
为了访问 logcat,您首先需要安装 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 的更多信息,请阅读此。
我不确定有没有办法只查看有关您的应用程序的系统消息,但您可以根据字符串进行过滤。如果你在程序中做一个日志,你可以只包含一个特定的关键字,并根据该词进行过滤。
给你的日志一个名字。我叫我的“哇”。
在 Android Studio 中,转到 Android-> Edit Filter Configurations
然后输入您为日志提供的名称。就我而言,它被称为“wawa”。以下是您可以执行的过滤器类型的一些示例。您可以按 System.out、System.err、Logs 或包名称进行过滤:
尝试:窗口 -> 首选项 -> Android -> LogCat。更改字段“Show logcat view if ...”的值“VERBOSE”。它帮助了我。
如果您使用的是Eclipse ,请在下面的logCat窗口中按绿色 + 符号,然后将您的包名称 (com.example.yourappname) 放在按应用程序名称框中。此外,在“过滤器名称”框中选择任何适合您的名称,然后单击“确定”。当您从 logCat 的左侧窗格中选择刚刚添加的过滤器时,您将只看到与您的应用程序相关的消息。
我有不同的方法,你可以尝试访问本地设备的外壳。
adb shell
然后跟着
logcat | grep com.package.name
此打印全部包含该包。
或者,您可以尝试flutter logs --verbose
这可能是最简单的解决方案。
在 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`"
您可以使用以下命令为您的应用程序包获取详细日志
adb logcat com.example.myapp:V *:S
此外,如果您已经推出了您的应用程序并且您想从已发布的应用程序中获取错误日志,您可以使用以下命令。
adb logcat AndroidRuntime:E *:S
对于 Windows,您可以使用我的 PowerShell 脚本仅显示您的应用程序的消息: https ://github.com/AlShevelev/power_shell_logcat
除了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%
我尝试使用 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"
我通常会在日志消息中添加一些内容以使其与众不同。或者例如统一应用程序,您可以使用“Unity”作为匹配字符串。
对于 mac:
adb logcat | grep "MyUniqueString"
对于 Windows(powershell):
adb logcat | Select-String "MyUniqueString"
现在可以键入 tag:nameofthetag 或 app:nameoftheapp 进行过滤,而无需将新过滤器添加到已保存的过滤器栏
在 intelliJ 中(也可能在 eclipse 中),您可以通过 text webview过滤 logcat 输出,因此它基本上打印了 phonegap 产生的所有内容
当您在 shell 中时,另一种获取确切包名称日志的方法:
logcat --pid $(ps -ef | grep -E "com.example.app\$" | awk '{print $2}')
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>]
这显然是一个针对从开发人员设备外部使用 Logcat 的问题,但是如果你想在设备上显示 Logcat 输出(以编程方式),你只需要这个:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
最后*:D
过滤掉调试日志级别以下的每条消息,但您可以将其排除在外。
要将输出定向到例如 TextView,请参见此处的示例。
在linux中,这对我有用:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`