直接从Android登录Cloudwatch

问题描述 投票:0回答:1

我一直在尝试将 Cloud Watch Logging 集成到我的 Android 应用程序中,该应用程序可以直接记录日志,而无需使用任何其他 API 调用。我查看了 AWS Amplify,但没有适用于 Android 的日志记录

使用 API Gateway 创建 API 并将其连接到记录发送数据的 Lambda 很容易,但我不研究这种解决方案。

android amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs
1个回答
1
投票

我能够在应用程序中使用 AWS SDK 实施该解决方案,并通过 Amplify 提供临时凭证。

更新:这就是我在 Android 中实现它的方式

使用 Hilt 提供的客户端:

    @ViewModelScoped
    @Provides
    fun provideAmazonCloudWatchLogsClient(@ApplicationContext context: Context): AmazonCloudWatchLogsClient {

        val credentialsProvider = CognitoCachingCredentialsProvider(
            context,
            "<Identity-Pool-id-from-cognito>",
            Regions.US_WEST_2
        )

        val region: Region = Region.getRegion(Regions.US_WEST_2)
        val client =  AmazonCloudWatchLogsClient(credentialsProvider)
        client.setRegion(region)
        return client
    }

从用例记录:

fun cloudWatchLog(eventType: EventType, appLog: AppLog, level: LogLevel = LogLevel.INFO) =
        flow {
            try {
                emit(Resource.Loading())

                val isUserSignedIn = authUser.getUserId().let { id -> !(id.isEmpty() || id == "null") }

                val logEvent = PutLogEventsRequest().apply {
                    logGroupName = LogStream.ANDROID_LOG.stream
                    logStreamName = authUser.getUserId()
                        .let { id -> if (id.isEmpty() || id == "null") preferences.getLogsUserId()
                                     else id
                        }
                }

                val currentTime = System.currentTimeMillis()
                val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                val currentDate = simpleDateFormat.format(Date(currentTime))

                val event = InputLogEvent().apply {
                    timestamp = currentTime
                    message =
                        "[$currentDate] ${level.level} [${if(isUserSignedIn) "LOGGED ✅" else "TEMP ❌"}] ${eventType.type} " +
                                when (eventType) {
                                    EventType.CODE -> appLog.toCodeString()
                                    EventType.CUSTOM, EventType.QR  -> appLog.toMessageString()
                                    else -> appLog
                                }
                }

                val list = ArrayList<InputLogEvent>().apply { add(event) }

                logEvent.setLogEvents(list)

                if (internetUseCase()) {

                    val describeRequest = DescribeLogStreamsRequest()
                        .withLogGroupName(logEvent.logGroupName)
                        .withLogStreamNamePrefix(logEvent.logStreamName)

                    describeRequest.limit = 1

                    val describeResult = logs.describeLogStreams(describeRequest);

                    if (describeResult.logStreams.isEmpty()) {

                        val createRequest = CreateLogStreamRequest()
                            .withLogGroupName(logEvent.logGroupName)
                            .withLogStreamName(logEvent.logStreamName);

                        LogAndToast.log("AppLogUploadUseCase", "Log Stream does not exist")

                        logs.createLogStream(createRequest)
                        logs.putLogEvents(logEvent)
                    } else {
                        LogAndToast.log("AppLogUploadUseCase", "Log Stream does exists")
                        logs.putLogEvents(logEvent)
                    }
                    emit(Resource.Success(data = "Success!"))
                    return@flow
                } else {
                    emit(Resource.Error(message = "Failed App Logs - No Internet"))
                }

            } catch (e: Exception) {
                LogAndToast.log("AppLogUploadUseCase", "Error = ${e.message}")
                emit(Resource.Error(message = e.message ?: "An unknown error"))
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.