如何限制 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?