【问题标题】:Filter LogCat to get only the messages from My Application in Android?过滤 LogCat 以仅从 Android 中的“我的应用程序”中获取消息?
【发布时间】:2023-03-24 16:54:02
【问题描述】:

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

【问题讨论】:

  • 所有答案都建议过滤来自正在调试的应用程序的消息。即使启用了这些过滤器,来自其他应用程序的 Logcat 垃圾邮件也会很快填满日志缓冲区,无论它有多大。有没有办法告诉 Eclipse 根本不收集这些消息或继续定期删除它们?
  • github.com/kashifrazzaqui/punt 试试这个 CLI 工具 - 它让过滤变得更加容易。

标签: android android-studio logcat


【解决方案1】:

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

【讨论】:

  • @BTRNaidu:你可以安装 Cygwin 或者使用 git-bash(windows 的 bash)
  • pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
  • 有时gc在释放内存时打印与进程的pid号相同的数字。这是另一个版本adb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
  • 在 Windows 上你可以这样做:adb logcat | findstr com.example.package
  • 只是对您的答案稍作改动。我建议:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
【解决方案2】:

包名保证是唯一的,所以你可以使用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 中。

【讨论】:

  • 我知道这个问题是关于 eclipse 的,但我爱上了命令行,并且总是将它用于 logcat。还可以使用一些工具对输出进行着色,例如 jsharkey.org/blog/2009/04/22/… 使其更加有用
  • 在模拟器上测试:当我执行 adb -e logcat com.example.example:I *:S, adb -d logcat System.out:I *:S 时它卡住了。跨度>
  • @Shubh 卡住了是什么意思?我在差不多一年前发布了这篇文章,所以从那时起 Logcat 中的某些内容可能发生了变化。
  • 此方法按标签过滤,而不是按应用过滤。 Tom 的方法按应用过滤
  • 通过使用logcat <your package name>:<log level>,答案表明可以将包名称用作有效过滤器。我需要阅读答案两次才能理解它的实际含义,因此我建议将第一行简单地更改为“logcat <tag>:<log level> 其中<tag> 可以是你的包名称,如果你也用作android.util.Log 中的标签”
【解决方案3】:

从 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

【讨论】:

  • 我尝试了所有grepfindstr 选项,但它们仅过滤具有某些值的日志,不包括大量消息。您的答案是真实的,显示有关应用程序的所有日志,而不排除来自其他库的日志消息。这就像 Android Studio 当前的“仅显示选定的”过滤器。谢谢!
  • 只要进程“com.example.app”正在运行,这两个命令就可以工作。但是,如果进程未运行,则会显示错误消息。只是一个旁注,以避免意外。
  • 这里唯一真正有效并按照 OP 要求执行的答案。虽然,OP 确实在 11 年提出了要求,并且情况可能在 6 年内发生了很大变化,但这个答案在 2020 年仍然有效。
  • 哦,我明白了,完全没有运行的应用程序不会有 PID!
  • @Ben Butterworth:正确。当应用程序未运行时,它没有 PID。因此,键入上述命令可能会导致输出消息:pid out of range。
【解决方案4】:

添加过滤器

指定名称

选择您的过滤器。

【讨论】:

  • 在设计开发工具时,精确非常重要,因为用户期望精确。那是包名称,而不是应用程序名称。 >:(
【解决方案5】:

这适用于我的 USB 调试:

解决方案是直接通过 shell 使用设备自带的 logcat

  1. 连接设备并使用:

    adb shell

  2. 设置好shell后使用logcat:

    logcat | grep com.yourapp.packagename

【讨论】:

  • 这为我节省了很多时间和麻烦。非常简洁,切中要害。谢谢!
【解决方案6】:

对我来说,这适用于 mac Terminal
转到您拥有adb 的文件夹,然后在终端中键入以下命令

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

这里会过滤MyTAGAndroidRuntime的所有日志

【讨论】:

  • 1) Java 代码: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 的错误
  • 这是在 MacOS 上对我有用的唯一答案。干得好。
  • @om-ha 谢谢,我使用 Studio 很久了,不知道它还有问题
  • 事实上我没有使用 Android Studio。我正在使用 Flutter、Android SDK 和 Gradle。作为编辑器,VS Code。所以这是了解我的 android 手机中发生了什么的绝佳方式
【解决方案7】:

5 月 17 日更新

几年过去了,情况发生了变化。并且 Eclipse 不再受到官方支持。所以这里有两种最新的方法:

1。安卓工作室

Android monitor 工具箱中,您可以根据debuggable process 过滤logcat。通常,当您开发应用程序时,它是一个可调试的过程。每隔一段时间我都会遇到这个问题,请执行以下操作:

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

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

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

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。

【讨论】:

  • 查看所有这些你必须做的事情,只是为了获取你的应用程序的日志,而不是其他应用程序。另外,我真的觉得其他人可以看到其他人的日志很可笑。你是在告诉我谷歌对此无能为力吗?只要确保我的日志不会被其他人看到,并保持我的 logcat 干净?
【解决方案8】:

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

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

【讨论】:

    【解决方案9】:

    Ubuntu : adb logcat -b all -v color --pid=`adb shell pidof -s com.packagename` 带颜色和app的连续日志

    【讨论】:

    • adb shell pidof ... 位对我不起作用,所以我将 adb shell 编辑到设备中并运行 top 在那里复制了我的应用程序的 PID,然后在你的命令中替换它
    • 尝试pgrep而不是pidof
    • 这在 OSX 上适用于我,为 -v color 加分
    【解决方案10】:

    把这个放到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(由 | 分隔)。
    【解决方案11】:

    如果您使用的是 Android Studio,您可以选择要从中接收 logcat 的进程。 这是屏幕截图。

    【讨论】:

    • 从 android studio 版本 0.4.5 开始,您将从仅运行的应用程序中获取消息。 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
    【解决方案12】:

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

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

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

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

    【讨论】:

      【解决方案13】:

      使用-s

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

      喜欢。

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

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

      adb logcat -s AlexeysActivity
      

      这会过滤掉所有不使用相同标签的东西。

      Source

      【讨论】:

      • 不要假设您正在编写代码。您可能关心来自库的消息,并且您无法更改日志字符串。
      【解决方案14】:

      使用 Windows 命令提示符:adb logcat -d | findstr &lt;package&gt;

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

      【讨论】:

        【解决方案15】:

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

        我喜欢能够按应用进行过滤,但新的 logcat 的自动滚动存在错误。当您向上滚动一点查看以前的日志时,它会在几秒钟内自动滚动回底部。似乎将日志向上滚动 1/2 确实可以防止它跳回底部,但这通常是无用的。

        编辑:我尝试从命令行指定应用过滤器——但没有运气。如果有人知道这一点或如何停止自动滚动,请告诉我。

        【讨论】:

          【解决方案16】:

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

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

          来自文档:

          在应用程序开发期间,您通常只想显示来自您的应用程序的日志消息。不幸的是,因为每次部署到手机时进程 ID 都会发生变化,因此 grep 找到正确的东西是一项挑战。

          此脚本通过按应用程序包过滤解决了该问题。

          输出看起来像

          【讨论】:

            【解决方案17】:

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

            adb logcat | findstr INFO:CONSOLE
            

            【讨论】:

              【解决方案18】:

              为了访问 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=&lt;pid&gt; :获取特定于您的应用的 logcat。

              adb logcat pid=&lt;pid&gt;|grep 'sometext':根据一些文本过滤logcat。

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

              【讨论】:

              • 这个答案应该有效,但它不适合我。 logcat 只是不断地从每个应用程序中吐出每条日志消息。
              【解决方案19】:

              我不确定是否有办法只查看有关您的应用的系统消息,但您可以根据字符串进行过滤。如果你在程序中做日志,你可以只包含某个唯一的关键字,然后根据这个词进行过滤。

              【讨论】:

                【解决方案20】:

                尝试:窗口 -> 首选项 -> Android -> LogCat。更改字段“Show logcat view if ...”的值“VERBOSE”。它帮助了我。

                【讨论】:

                  【解决方案21】:

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

                  【讨论】:

                    【解决方案22】:

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

                    在 Android Studio 中,转到 Android-> Edit Filter Configurations

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

                    【讨论】:

                      【解决方案23】:

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

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

                      【讨论】:

                        【解决方案24】:

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

                        adb shell

                        然后跟着

                        logcat | grep com.package.name

                        这个打印全部包含那个包。

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

                        【讨论】:

                          【解决方案25】:

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

                          【讨论】:

                            【解决方案26】:

                            除了 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%
                            

                            【讨论】:

                              【解决方案27】:

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

                              【讨论】:

                                【解决方案28】:

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

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

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

                                adb logcat AndroidRuntime:E *:S

                                【讨论】:

                                  【解决方案29】:

                                  我通常会在日志消息中添加一些内容以使其与众不同。或者例如统一应用程序,您可以使用“Unity”作为匹配字符串。

                                  Mac 版:

                                  adb logcat | grep "MyUniqueString" 
                                  

                                  对于 Windows (powershell):

                                  adb logcat | Select-String "MyUniqueString"
                                  

                                  【讨论】:

                                    【解决方案30】:

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

                                    【讨论】:

                                      猜你喜欢
                                      • 2015-07-22
                                      • 1970-01-01
                                      • 2013-12-28
                                      • 1970-01-01
                                      • 2013-01-28
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多