我一直在尝试将 Cloud Watch Logging 集成到我的 Android 应用程序中,该应用程序可以直接记录日志,而无需使用任何其他 API 调用。我查看了 AWS Amplify,但没有适用于 Android 的日志记录
使用 API Gateway 创建 API 并将其连接到记录发送数据的 Lambda 很容易,但我不研究这种解决方案。
我能够在应用程序中使用 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"))
}
}