从 logcat 中过滤掉某些日志

Filter out certain logs from logcat

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

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

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

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

我知道如何使用混淆器禁用日志。我想要一个没有 proguard 的解决方案,因为在此开发版本中禁用了 proguard。

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

Log.i("MyTag", msg);

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

Tag:MyTag

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

app:com.example.yourappname

编辑: 由于评论:

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

过滤 logcat

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

从命令行使用 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

将前两个答案与对 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 的“终端”选项卡中运行得非常好。

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

的行
  1. Logcat-Window中点击filter-dropdown menu
  2. select "edit Filter Configuration"
    Log Message 字段中输入以下代码:^((?!zip).)*$
    select regex 在字段的右侧。

我在下面的 post 中找到了这种使用正则表达式的方法:Regular expression to match a line that doesn't contain a word?