[6.3.0][日志] 过滤指定Tag;并对特定Tag做check(如:ANR LOG)

This commit is contained in:
renwj
2024-03-06 17:17:28 +08:00
parent 4b7fbbc42a
commit 1e23082c28
6 changed files with 72 additions and 34 deletions

View File

@@ -225,7 +225,7 @@ ext {
btrace : "com.bytedance.btrace:rhea-core:2.0.0",
mofang_runtime : "com.mogo.eagle.core.mofang:runtime:2.0.11",
log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.30",
log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.50",
// 安全证书
passport_secret : "com.zhidaoauto:sdk-java:1.0.6-SNAPSHOT",

View File

@@ -47,30 +47,7 @@ internal class MoGoBlockProviderImpl: IMoGoBlockProvider, IBlockListener {
Log.d("BLOCK", "--- onBlockReport ---: ${info.frames.size}")
val map = mutableMapOf<String, List<String>>()
map["frames"] = info.frames.map { "$it" }
BlockDetector.recorder().dump(object: OnDumpListener {
override fun OnDumped(data: Map<Int, List<String>>) {
map["history"] = data[0] ?: emptyList()
map["pending"] = data[1] ?: emptyList()
val cpu = CallerDevaToolsManager.usage()?.dump()
if (!cpu.isNullOrEmpty()) {
val mainThreadUsage = cpu.remove("MainThreadUsage")
val processUsage = cpu.remove("ProcessUsage")
if (mainThreadUsage != null && processUsage != null) {
map["cpu"] = ArrayList<String>().also {
it.add("main-thread: ${ "%.2f".format(mainThreadUsage * 1.0f * 100 / processUsage) }% ($mainThreadUsage, $processUsage)")
for (e in cpu.entries.sortedByDescending { e -> e.value }) {
it.add("${e.key}: ${ "%.2f".format(e.value * 1.0f * 100 / processUsage) }% (${e.value}, $processUsage)")
}
}
}
}
try {
VLogUtils.w("BLOCK", GsonUtils.toJson(map))
} catch (t: Throwable) {
t.printStackTrace()
}
}
})
dump(map)
}
override fun monitor(window: Window) {
@@ -102,4 +79,33 @@ internal class MoGoBlockProviderImpl: IMoGoBlockProvider, IBlockListener {
override fun recorder(): IMessageRecorder {
return BlockDetector.recorder()
}
override fun dump(extra: Map<String, List<String>>?) {
val map = mutableMapOf<String, List<String>>()
extra?.takeIf { it.isNotEmpty() }?.also { map.putAll(it) }
BlockDetector.recorder().dump(object: OnDumpListener {
override fun OnDumped(data: Map<Int, List<String>>) {
map["history"] = data[0] ?: emptyList()
map["pending"] = data[1] ?: emptyList()
val cpu = CallerDevaToolsManager.usage()?.dump()
if (!cpu.isNullOrEmpty()) {
val mainThreadUsage = cpu.remove("MainThreadUsage")
val processUsage = cpu.remove("ProcessUsage")
if (mainThreadUsage != null && processUsage != null) {
map["cpu"] = ArrayList<String>().also {
it.add("main-thread: ${ "%.2f".format(mainThreadUsage * 1.0f * 100 / processUsage) }% ($mainThreadUsage, $processUsage)")
for (e in cpu.entries.sortedByDescending { e -> e.value }) {
it.add("${e.key}: ${ "%.2f".format(e.value * 1.0f * 100 / processUsage) }% (${e.value}, $processUsage)")
}
}
}
}
try {
VLogUtils.w("BLOCK", GsonUtils.toJson(map))
} catch (t: Throwable) {
t.printStackTrace()
}
}
})
}
}

View File

@@ -0,0 +1,11 @@
package com.zhjt.mogo_core_function_devatools.block.observer
import com.mogo.core.log.record.config.checker.ILogcatChecker
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
class AnrLogcatObserver: ILogcatChecker.ILogcatCheckObserver {
override fun onGet() {
CallerDevaToolsManager.block()?.dump()
}
}

View File

@@ -10,12 +10,12 @@ import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.commons.AbsMogoApplication
import com.mogo.core.log.record.*
import com.mogo.core.log.record.config.*
import com.mogo.core.log.record.config.crash.*
import com.mogo.core.log.record.config.state.IStateProvider
import com.mogo.core.log.record.model.UploadError
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.function.api.devatools.logcat.*
import com.zhidao.loglib.bean.RemoteLogPushContent
import com.zhjt.mogo_core_function_devatools.logcat.checker.AnrLogChecker
import com.zhjt.mogo_core_function_devatools.logcat.config.LogRecordConfig
import com.zhjt.mogo_core_function_devatools.logcat.uploader.*
import kotlinx.coroutines.*
@@ -99,17 +99,12 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider,
itx["协议版本号"] = AppConfigInfo.protocolVersionNumber
itx["${divider}-7"] = divider
itx["角色"] = AppConfigInfo.role
}
}
})
.crashConfig(CrashConfig.Builder()
.enabled(false)
.crashDir(File(context.getExternalFilesDir(null), "logcat/crash"))
.javaCrash(true)
.anr(true)
.nativeCrash(true)
.build())
.ignoreTags(" OpenGLRenderer")
.systemTags(" ActivityManager")
.checker(AnrLogChecker())
.uploader(LogRecordUploader()))
scope.launch {
try {

View File

@@ -0,0 +1,24 @@
package com.zhjt.mogo_core_function_devatools.logcat.checker
import com.mogo.core.log.record.config.checker.ILogcatChecker
import com.zhjt.mogo_core_function_devatools.block.observer.AnrLogcatObserver
import okio.ByteString.Companion.encodeUtf8
import okio.Source
import okio.buffer
class AnrLogChecker: ILogcatChecker {
companion object {
private const val TAG = "AnrLogChecker"
}
private val anrByteString by lazy { "ANR in com.mogo.launcher.f".encodeUtf8() }
override fun check(data: Source): Boolean {
return data.buffer().indexOf(anrByteString) >= 0
}
override fun observer(): ILogcatChecker.ILogcatCheckObserver {
return AnrLogcatObserver()
}
}

View File

@@ -25,4 +25,6 @@ interface IMoGoBlockProvider {
fun stop()
fun recorder(): IMessageRecorder
fun dump(extra: Map<String, List<String>>? = null)
}