【问题标题】:How to throttle the same messages in the Logcat?如何限制 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 小时的工作来调查一些问题,这真的很烦人,我需要查看大量重复的消息,但我仍然需要他们看看是否一切正常。

标签: android kotlin logging rx-java


【解决方案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 函数中的逻辑。这肯定会奏效,尽管我只是使用同步映射类来更容易理解代码,除非您有太多日志语句以至于锁定时间成为问题。

【讨论】:

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