【问题标题】:Filter out certain logs from logcat从 logcat 中过滤掉某些日志
【发布时间】:2018-11-10 01:46:19
【问题描述】:

我正在使用一个 3rd 方库,该库目前有一些错误,会在 logcat 中不断地喷出特定的错误消息。有时这种情况每秒会发生多次。文字总是一样的。 这使得调试变得非常困难:

  • 让 logcat 滚动非常快
  • 很难找到相关日志
  • 填满整个日志文件,删除旧日志(通常只有一分钟左右)

我认为这对性能也不利,但这不是真正的问题。

在等待库中的修复时,我想从 logcat 中过滤掉这个特定的错误消息。这样我就可以看到除了这个错误和堆栈跟踪之外的所有内容。

我可以使用 Android Studio 过滤掉这个吗? 如果被过滤了,如果文件已满,消息还会被快速删除吗?

我知道如何使用 proguard 禁用日志。我想有一个没有 proguard 的解决方案,因为在这个开发版本中 proguard 被禁用。

【问题讨论】:

    标签: android android-studio logcat android-logcat


    【解决方案1】:

    要过滤掉Android-Studio 中不需要的logcat 消息,您可以使用正则表达式否定环视: 例如。过滤掉所有包含zip的行:

    1. Logcat-Window 点击filter-dropdown menu
    2. 选择"edit Filter Configuration"
      将以下代码放入Log Message 字段:^((?!zip).)*$
      并选择字段右侧的regex

    我在以下帖子中发现了这种使用正则表达式的方式:Regular expression to match a line that doesn't contain a word?

    【讨论】:

      【解决方案2】:

      1- 您可以在创建特定日志时为其添加标签:

      Log.i("MyTag", msg);
      

      并在 logcat 中像这样过滤它们:

      标签:我的标签

      2- 要仅过滤来自您的应用的所有日志,请通过键入以下内容过滤 logcat:

      app:com.example.yourappname

      编辑: 由于cmets:

      3- 要过滤线程创建的日志,请在运行时找到要过滤相同日志的日志。查看 TID 列并使用 TID(线程 ID)过滤 logcat

      请注意,每次您的应用再次运行时,您都应该再次执行此操作。

      【讨论】:

      • 感谢您的回答,但这对我没有帮助。日志由第三方库生成。我不想像那样过滤它们。我想查看每个日志,除了库中的那个(顺便说一句,它是 13 行单独的行)
      • 能否在运行时找到processID或ThreadID并过滤一下?
      • 这可能很有趣。如果你能启发我,那就太好了! =)
      【解决方案3】:

      在命令行中使用 adb,您可以轻松过滤掉特定标签。我有一个名为logcat_filtered 的脚本,看起来像这样:

      #!/bin/bash
      ANDROID_LOG_TAGS='AlarmManager:S daemonapp:S WifiStateMachine:S SensorService:S SignalStrength:S dalvikvm:S Exchange:S ProcessStatsService:S GCoreUlr:S dalvikvm-heap:S chromium:S DMCFaceEngine:S SmartFaceService:S SecCamera-JNI-Cpp:S Camera_HAL:S STATUSBAR-BatteryController:S STATUSBAR-PhoneStatusBar:S STATUSBAR-NetworkController:S Camera:S lights:S BatteryService:S IconMerger:S LockPatternUtils:S' adb logcat
      

      这消除了很多我不感兴趣的烦人的日志输出。

      一个更简单的解决方案,同样来自命令行,是使用 grep:

      adb logcat | grep -v dontwanttoseethisstring
      

      【讨论】:

        【解决方案4】:

        将前两个答案与对documentation 的一些检查相结合,为我提供了一个很好的解决方案来查看我想要的日志。

        adb -d logcat -v threadtime | grep -w 4451 | grep -v 4488
        

        -d 这样我就可以将输出限制为当前连接设备的日志,同时我仍然在后台运行模拟器。
        -v threadtime 这样我就可以看到Process IDThread ID 和时间戳。
        grep -w 4451 4451 是进程 ID。这确保我只能看到来自我的应用程序的日志。
        grep -v 4488 4488 是我要过滤掉的错误消息的线程 ID。这将删除具有指定线程 ID 的所有行。这是有效的,因为在我的情况下,错误消息只出现在一个单独的线程中。

        现在我可以看到我的应用程序中的所有日志,而不会因为库中的错误而产生所有噪音。 (未确认,但我相信当日志文件已满时,由于库中不断有错误消息流,日志仍然会消失。)

        这是一个命令行解决方案,所以它仍然不是在android studio中使用logcat的最佳解决方案。但它在 Android Studio 的“终端”选项卡中确实可以完美运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多