Sfoglia il codice sorgente

feat: 阿里上报

tongmengxiao 9 mesi fa
parent
commit
473e28825b

+ 4 - 1
app/proguard-rules.pro

@@ -260,4 +260,7 @@ public static java.lang.String TABLENAME;
 # If you do NOT use SQLCipher:
 -dontwarn net.sqlcipher.database.**
 # If you do NOT use RxJava:
--dontwarn rx.**
+-dontwarn rx.**
+
+-keep class com.aliyun.sls.android.producer.* { *; }
+-keep interface com.aliyun.sls.android.producer.* { *; }

+ 7 - 13
app/src/main/java/com/swago/app/SwagoApp.kt

@@ -15,6 +15,7 @@ import com.swago.baseswago.dialog.ForceOfflineDialog
 import com.swago.baseswago.inter.ApiManager
 import com.swago.baseswago.util.ActivityManagerUtil
 import com.swago.baseswago.util.AppContext
+import com.swago.baseswago.util.LogProducer
 import com.swago.baseswago.util.LogUtil
 import com.swago.baseswago.util.SwagoInfo
 import com.swago.baseswago.util.UserInfo
@@ -87,6 +88,7 @@ class SwagoApp : Application() {
                 LogUtil.d("成功--$code---$msg")
             }
         })
+        pushCrash()
     }
 
     override fun attachBaseContext(base: Context?) {
@@ -96,19 +98,11 @@ class SwagoApp : Application() {
 
     private fun pushCrash() {
         Thread.setDefaultUncaughtExceptionHandler { t, ex ->
-            runBlocking {
-                val jsonObject = JSONObject()
-                UserInfo.getUserInfo()?.let {
-                    jsonObject.put("id" , it.id)
-                }
-                jsonObject.put("version", SwagoInfo.getVersionCode())
-                jsonObject.put("device" , SwagoInfo.getDeviceInfo())
-                jsonObject.put("message","${ex.message}")
-                jsonObject.put("detail", ex.stackTraceToString())
-                if (!BuildConfig.DEBUG){
-                    ApiManager.configApi.pushCrash(jsonObject.toString())
-                }
-
+            val jsonObject = JSONObject()
+            jsonObject.put("message","${ex.message}")
+            jsonObject.put("detail", ex.stackTraceToString())
+            if (!BuildConfig.DEBUG){
+                LogProducer.addLog(jsonObject, "error")
             }
         }
     }

+ 1 - 1
baseswago/build.gradle

@@ -136,5 +136,5 @@ dependencies {
     //lottie
     api 'com.airbnb.android:lottie:4.0.0'
     api  'org.greenrobot:greendao:3.3.0' // 添加库
-
+    implementation 'io.github.aliyun-sls:aliyun-log-android-sdk:2.7.0@aar'
 }

+ 2 - 0
baseswago/src/main/java/com/swago/baseswago/im/GroupMsgParser.kt

@@ -68,6 +68,7 @@ import com.swago.baseswago.model.live.audio.*
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.model.live.mic.LianMaiIMModel
 import com.swago.baseswago.model.live.pk.*
+import com.swago.baseswago.util.LogProducer
 import com.swago.baseswago.util.LogUtil
 import com.tencent.imsdk.v2.V2TIMMessage
 import org.json.JSONObject
@@ -98,6 +99,7 @@ class GroupMsgParser : IGroupNewMsgParser {
         try {
             val resultString = String(result)
             val jsonObject = JSONObject(resultString)
+            LogProducer.addLog(jsonObject, "imCallback")
             LogUtil.d("SwagoIM",resultString)
             var parameterizedTypeImpl: ParameterizedTypeImpl? = null
             when(jsonObject.getInt("type")){

+ 3 - 0
baseswago/src/main/java/com/swago/baseswago/inter/ConfigApi.kt

@@ -2,6 +2,7 @@ package com.swago.baseswago.inter
 
 import com.swago.baseswago.model.ConfigModel
 import com.swago.baseswago.model.DomainConfig
+import com.swago.baseswago.model.LogProducerModel
 import retrofit2.http.Field
 import retrofit2.http.FormUrlEncoded
 import retrofit2.http.GET
@@ -31,4 +32,6 @@ interface ConfigApi {
     @POST("android/error/push")
     suspend fun pushCrash(@Field("message") message:String):Any
 
+    @POST("/upload/log/token")
+    suspend fun getLogToken(): LogProducerModel
 }

+ 8 - 0
baseswago/src/main/java/com/swago/baseswago/model/LogProducerModel.kt

@@ -0,0 +1,8 @@
+package com.swago.baseswago.model
+
+data class LogProducerModel (
+    val access_key_id:String="",
+    val access_key_secret:String="",
+    val security_token:String="",
+    val expiration:Long
+)

+ 79 - 0
baseswago/src/main/java/com/swago/baseswago/util/LogProducer.kt

@@ -0,0 +1,79 @@
+package com.swago.baseswago.util
+
+import com.aliyun.sls.android.producer.Log
+import com.aliyun.sls.android.producer.LogProducerClient
+import com.aliyun.sls.android.producer.LogProducerConfig
+import com.aliyun.sls.android.producer.LogProducerException
+import com.aliyun.sls.android.producer.LogProducerResult
+import com.swago.baseswago.inter.ApiManager
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import org.json.JSONObject
+import java.text.SimpleDateFormat
+import java.util.Date
+
+
+object LogProducer {
+    private var config: LogProducerConfig? = null
+    private var client: LogProducerClient? = null
+    private var sdf: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+
+    init {
+        initProducer()
+    }
+
+    private fun initProducer() {
+        try {
+            config = LogProducerConfig()
+            config?.endpoint = "cn-hongkong.log.aliyuncs.com"
+            config?.project = "yunwei-swago"
+            config?.logstore = "app"
+            client = LogProducerClient(config
+            ) { resultCode, reqId, errorMessage, logBytes, compressedBytes ->
+                val result = LogProducerResult.fromInt(resultCode)
+                if (LogProducerResult.LOG_PRODUCER_SEND_UNAUTHORIZED == result || LogProducerResult.LOG_PRODUCER_PARAMETERS_INVALID == result) {
+                    // 需要更新AccessKey或者SDK的初始化参数。
+                    requestAccessKey()
+                }
+            }
+        } catch (e: LogProducerException) {
+            e.printStackTrace()
+        }
+    }
+
+    private fun requestAccessKey() {
+        CoroutineScope(Dispatchers.Default).launch {
+            val model = ApiManager.configApi.getLogToken()
+            updateAccessKey(model.access_key_id,model.access_key_secret,model.security_token)
+        }
+    }
+
+    private fun updateAccessKey(accessKeyId:String,accessKeySecret:String,securityToken:String?){
+        if (!securityToken.isNullOrEmpty()){
+            config?.resetSecurityToken(accessKeyId,accessKeySecret,securityToken)
+        } else {
+            config?.setAccessKeyId(accessKeyId)
+            config?.setAccessKeySecret(accessKeySecret)
+        }
+    }
+    fun addLog(customLog:JSONObject,type:String){
+        if (null == client) {
+            return
+        }
+        val log = Log()
+        val jsonObject =JSONObject()
+        val jsonContentsObject =JSONObject()
+        jsonContentsObject.put("type", type)
+        jsonContentsObject.put("device_info", SwagoInfo.getDeviceInfo())
+        jsonContentsObject.put("device_system", "android")
+        jsonContentsObject.put("app_channel", SwagoInfo.getChannel())
+        jsonContentsObject.put("app_version",SwagoInfo.getVersionCode())
+        jsonContentsObject.put("user_id", UserInfo.getUserInfo()?.id)
+        jsonContentsObject.put("custom_log", customLog)
+        jsonObject.put("time", sdf.format(Date(System.currentTimeMillis())))
+        jsonObject.put("contents",jsonContentsObject)
+        log.putContent(jsonObject)
+        client?.addLog(log)
+    }
+}