android logcat 记录聊天模块行过期消息

Posted

技术标签:

【中文标题】android logcat 记录聊天模块行过期消息【英文标题】:android logcat logs chatty module line expire message 【发布时间】:2016-01-04 08:35:51 【问题描述】:

我收到很多与我的应用程序相关的此类 logcat 消息。

11-19 19:04:23.872 3327 3440 I chatty : uid=10085 com.xxxx.yyy expire 18 lines

这些日志消息是什么?我在这里错过了我的实际应用程序 logcat 日志吗?

【问题讨论】:

我也得到了这些,虽然我的应用程序运行良好,但我很想知道它们表示什么。我猜与日志记录有关吗? 01-22 16:04:14.256 2398 2398 I chatty : uid=10126(be.xxx.yyyyyyyyyy) expire 11 lines 【参考方案1】:

我想添加另一个答案,因为现有答案都没有真正回答“我在这里错过了我的实际应用程序 logcat 日志吗?”问题。

是的,你错过了日志。只要应用程序被 logcat 认为是“聊天”(每秒超过 5 行),你的应用程序的日志就会折叠起来。

您可以通过将您的应用列入 logcat 的白名单来避免这种行为:

adb logcat -P '<pid or uid of your app>'

可以通过执行打印当前的白名单和黑名单:

adb logcat -p

此命令还有助于打印 logcat 统计信息:

adb logcat -S

此外,我发现在测试期间直接从代码中为 logcat 自动将我的应用程序自动列入白名单很有用:

int pid = android.os.Process.myPid();
String whiteList = "logcat -P '" + pid + "'";
Runtime.getRuntime().exec(whiteList).waitFor();

更多信息可以在logcathere的官方文档中找到

【讨论】:

@lorenzo-s adb logcat -padb logcat -S 的输出是什么? adb logcat -p 打印我的应用程序 PID,即我在 adb logcat -P 'pid' 中使用的那个,与我在 Studio 的 Android Monitor logcat 下拉列表中看到的相同。而here is 的输出为adb logcat -S 我在Chattiest UIDs in main log buffer: 部分中并没有真正看到您的应用程序。你确定你的应用被认为是健谈的吗? 是的,我经常在 logcat 中收到 chatty 消息,表示已跳过行。你看不到它,因为它可能是一个新的开始,我只运行该命令来向你发送输出。 Here is 打印一些闲聊消息后的相同日志,我的应用程序是 PID 11432 的应用程序,与 adb logcat -p 看到的相同 在使用 adb 从命令行执行此操作时,这对我来说效果很好,但从应用程序以编程方式执行时,它似乎不起作用。无论使用 uid、pid 还是 uid/pid,它每次都会返回退出代码 1,并且 adb logcat -p 反映的列表不显示应用程序。我建议只使用第三方日志框架,例如 log4j。【参考方案2】:

是的,这表明某些消息没有进入实际日志,可能是因为其他应用程序向其中发送了太多消息。

这似乎是 Marshmallow(?) 中 liblog 中的新事物。找不到对新日志记录策略的明确解释,或者即使实际上有一个,但在here 中提到了更改:

一旦记录超过 5 个,我们就宣布应用程序过于健谈 一秒钟。请向应用程序的所有者提交一个错误,该错误 正在生成此开发人员详细调试级别的类日志记录垃圾邮件。日志 是 256KB,这意味着应用程序正在创建 DOS 攻击,并且 将日志时间跨度缩短到 6 秒(!),使其对所有其他人毫无用处。

【讨论】:

我看到很多 com.google.android.gms.persistent... 我应该向 Google 提交错误吗? :-D 另外,我经常看到它说“过期 1 行”……这怎么太啰嗦了? 我收集了 5-10 秒的日志,结果是来自 chatty 的 261 个日志条目,所以应该填补 bug,因为 chatty 太健谈了:D 如何在 IDE 上禁用此功能?【参考方案3】:

您可以使用以下方法禁用此行为:

adb logcat -P ""

或通过设置

setprop ro.logd.filter disable

setprop persist.logd.filter disable 

您可以在

查看代码

http://androidxref.com/7.1.2_r36/xref/system/core/logd/LogWhiteBlackList.cpp

【讨论】:

这些属性似乎并没有完全禁用它,但我认为如果您直接链接到 liblog 会有所帮助。 这是正确答案,投票给它,希望有一天它不是列表中的最后一个。 我在 Android 8.1 上使用了setprop persist.logd.filter disable,然后重新启动,但我仍然看到chatty ... identical 行。 identical 是否意味着消息仍然被丢弃? @zoulou 好吧,如果这些日志相同,那么除了这些相同日志的时间戳之外,您基本上不会错过任何其他内容【参考方案4】:

您可以使用以下方法禁用此行为:

adb logcat -P ""

【讨论】:

我们怎样才能重新打开它?这在任何地方都有记录吗? @nealmcb 我不认为你可以永远禁用它。这些东西总是暂时的,对吧? @milosmns 那么它会持续多久?直到重新启动? @nealmcb 在我的 6P 上它只是刷新日志并退出 我没有收到任何错误消息。在执行此命令 adb logcat -P "" 之后,它不会禁用聊天。我尝试提及我的应用程序的 UID/PID,它被列入白名单,但仍然健谈并没有被禁用。我的设备是一加5【参考方案5】:

首先执行adb logcat -S 以检查您的应用程序是否在最聊天的 UID/PID 下。

如果有,请执行以下命令将您的应用程序列入白名单

adb logcat -P "UID/PID"

要检查所有列入白名单/黑名单的应用程序,请执行以下命令

adb logcat -p

【讨论】:

以上是关于android logcat 记录聊天模块行过期消息的主要内容,如果未能解决你的问题,请参考以下文章

android studio 中 adb logcat 在这里敲

如何在 Windows 中轻松查看和过滤 Android 的 logcat?

如何在 Android 的 TextView 中打印完整的 logcat 历史记录?

Android 库 *.aar 不记录到 logcat?

使用 logcat Android Studio 记录错误

Android Studio logcat 历史记录/缓冲区大小