我观察到,当我将Logcat与Eclipse和Android的ADT结合使用时,我也从许多其他应用程序中获取消息。有没有一种方法可以对此进行过滤,并且仅显示来自我自己的应用程序的消息。
我观察到,当我将Logcat与Eclipse和Android的ADT结合使用时,我也从许多其他应用程序中获取消息。有没有一种方法可以对此进行过滤,并且仅显示来自我自己的应用程序的消息。
Answers:
包名称保证是唯一的,因此您可以将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中。
logcat <your package name>:<log level>
答案,可以将包名称用作有效的过滤器。我需要阅读的答案两次来理解它实际上是在说,因此,我建议干脆第一行更改为类似“ logcat <tag>:<log level>
这里<tag>
可以成为你的包名,如果你在还用作标签android.util.Log
”
使用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
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
adb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
adb logcat | findstr com.example.package
adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
从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
grep
and findstr
选项,但它们仅过滤具有某些值的日志,但不包括很多消息。您的答案是真实的答案,显示有关该应用程序的所有日志,而不排除来自其他库的日志消息。就像Android Studio当前的“仅显示所选内容”过滤器一样。谢谢!
对我来说,这在Mac中有效Terminal
转到您所在的文件夹,adb
然后在终端中键入以下命令
./adb logcat MyTAG:V AndroidRuntime:E *:S
这将过滤的所有日志MyTAG
和AndroidRuntime
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的错误
已经过了几年了,事情发生了变化。而且Eclipse不再受正式支持。因此,这里还有两种最新的方法:
在Android monitor
工具箱中,您可以按过滤logcat debuggable process
。通常,在开发应用程序时,这是一个可调试的过程。我不时遇到这个问题,请执行以下操作:
Tools
- > Android
- > Enable ADB Integration
。
如果已启用,则将其关闭,然后再打开
拔下并重新插入您的移动设备。
还有一些通过正则表达式和调试级别过滤的选项
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。
放到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(用分隔|
) 。
如果您使用的是Android Studio,则可以选择要接收日志记录的过程。这是屏幕截图。
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
我写了一个shell脚本,用于按软件包名称过滤logcat,我认为它比使用更可靠
ps | grep com.example.package | cut -c10-15
它使用/ proc / $ pid / cmdline找出实际的pid,然后在logcat上执行grep
Ubuntu: adb logcat -b all -v color --pid =`adb shell pidof -s com.packagename`具有应用程序的颜色和连续日志
adb shell pidof ...
位对我不起作用,所以我adb shell
进入设备并在其中top
复制了我的应用程序的PID,然后在您的命令中替换了它
pgrep
代替pidof
尝试:窗口->首选项-> Android-> LogCat。将字段“如果...则显示logcat视图”更改为值“ VERBOSE”。它帮助了我。
如果您使用的是Eclipse,请在下面的logCat窗口中按绿色+号,然后在“ 按应用程序名称”框中输入您的软件包名称(com.example.yourappname)。另外,在“ 过滤器名称”框中选择适合您的名称,然后单击“确定”。从logCat的左窗格中选择刚添加的过滤器时,您将仅看到与您的应用程序相关的消息。
这可能是最简单的解决方案。
除了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`"
我尝试使用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"
使用-s
!
您应该使用自己的标签,查看:http : //developer.android.com/reference/android/util/Log.html
喜欢。
Log.d("AlexeysActivity","what you want to log");
然后,当您想阅读日志时,请使用>
adb logcat -s AlexeysActivity
这样可以过滤掉所有不使用相同标签的内容。
在intelliJ中(也可能在eclipse中),您可以通过文本webview过滤logcat输出,因此它基本上打印出phonegap产生的所有内容
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>]