如何限制 Logcat 中的相同消息?

Posted

技术标签:

【中文标题】如何限制 Logcat 中的相同消息?【英文标题】:How to throttle the same messages in the Logcat? 【发布时间】:2022-01-11 19:22:53 【问题描述】:

我需要使用 Log 类记录 android 应用程序的重要内容。我主要使用调试、信息和错误类型。我的问题是一些日志经常打印到 Logcat,例如GPS状态,手机的监听空闲空间等。对于应用程序来说,一些更新之间的这个差距是至关重要的,不能改变,但我不需要Logcat中那么多重复的行。

我的目标是:

如果是某条消息的第一次,请按原样打印 如果消息恰好出现较早,请检查定义的时间间隔是否已经过去,如果没有忽略日志

我创建了 LogData 类:

data class LogData(
    val message: String,
    val type: LogType
)

类型是:

enum class LogType 
    DEBUG,
    INFO,
    ERR

我想知道是否可以为此使用 RxJava 和一些节流运算符,但我不知道如何准确地考虑相同的消息并忽略它:

        log.throttleFirst(GAP_IN_MS, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe  (message, type) ->
                when(type) 
                    LogType.DEBUG -> debugMessage(message)
                    LogType.INFO -> infoMessage(message)
                    LogType.ERR -> errorMessage(message)
                
            

在哪里private val log = BehaviorSubject.create<LogData>()

【问题讨论】:

有趣的问题,虽然我不确定在应用程序日志记录中构建逻辑是一个多么好的想法,但也许你真的需要这样做 @a_local_nobody 我从例如12 小时的工作来调查一些问题,这真的很烦人,我需要查看大量重复的消息,但我仍然需要他们看看是否一切正常。 【参考方案1】:

我认为这里不需要 RX,只是日志的包装器。

class MyLogger 

  private val messagesSent = mutableMapOf<LogData, Long>()
  private val timeOut = 1000;  //number of ms that must pass before logging the same object again
  
  fun log(message: LogData) 
    if((messagesSent?.get(message) ?: 0) < System.getCurrentTimeMillis - timeOut) 
      Log.d(message.message)
      messagesSent.put(message, System.getCurrentTimeMillis())
    
  

然后使用它来代替 android 记录器。如果您想要比节流超时更复杂的东西,只需在此处输入该逻辑即可。

现在,随着时间的推移,messagesSent 映射的大小会慢慢增加。如果这成为内存问题,您可以创建一个线程或协程,每隔一段时间就会遍历地图并在几秒前从它驱逐任何东西。

现在您将遇到线程问题。避免它的最简单方法是使用同步地图类。如果您不想这样做,您可以使用 rx 并让 logger 类有一个 observable,让 log 将值发布到该 observable,并让该 observable 的订阅者当前执行我的 log 函数中的逻辑。这肯定会奏效,尽管我只是使用同步映射类来更容易理解代码,除非您有太多日志语句以至于锁定时间成为问题。

【讨论】:

以上是关于如何限制 Logcat 中的相同消息?的主要内容,如果未能解决你的问题,请参考以下文章

eclipse中的Android LogCat:如何过滤LogCat消息?

如何在没有app包限制的情况下使用map v2 api key?

如何从 DDMS 中的 Android 可穿戴设备获取 logcat 消息/堆栈跟踪

如何过滤 ACRA 中的 logcat 输出?

在 discord.js 中的时间限制之前获取收集的消息

如何限制龙卷风 websocket 消息大小