Wong Joon Hui
2 years ago
8 changed files with 217 additions and 26 deletions
@ -0,0 +1,148 @@
|
||||
package com.cst.im30.utility; |
||||
|
||||
import android.os.Build; |
||||
|
||||
import com.amazonaws.auth.BasicAWSCredentials; |
||||
import com.amazonaws.regions.Region; |
||||
import com.amazonaws.regions.Regions; |
||||
import com.amazonaws.services.logs.AmazonCloudWatchLogsClient; |
||||
import com.amazonaws.services.logs.model.CreateLogGroupRequest; |
||||
import com.amazonaws.services.logs.model.CreateLogStreamRequest; |
||||
import com.amazonaws.services.logs.model.DescribeLogStreamsRequest; |
||||
import com.amazonaws.services.logs.model.InputLogEvent; |
||||
import com.amazonaws.services.logs.model.LogStream; |
||||
import com.amazonaws.services.logs.model.PutLogEventsRequest; |
||||
import com.amazonaws.services.logs.model.PutLogEventsResult; |
||||
import com.amazonaws.services.logs.model.ResourceAlreadyExistsException; |
||||
import com.cst.im30.BuildConfig; |
||||
|
||||
import java.text.SimpleDateFormat; |
||||
import java.util.ArrayList; |
||||
import java.util.Calendar; |
||||
import java.util.Date; |
||||
import java.util.List; |
||||
import java.util.Locale; |
||||
|
||||
public class CloudWatchLogger { |
||||
|
||||
private AmazonCloudWatchLogsClient client; |
||||
|
||||
private PutLogEventsResult putLogEventsResult; // if you want to view the results of the put I guess
|
||||
|
||||
public CloudWatchLogger() { |
||||
// Can connect right away if you bundle the credentials in the Application.
|
||||
// If you use another method, just call connect() AFTER you have your credentials.
|
||||
connect(); |
||||
} |
||||
|
||||
private void connect() { |
||||
String accessKey = BuildConfig.AWS_ACCESS_KEY; |
||||
String secretKey = BuildConfig.AWS_SECRET_KEY; |
||||
BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey); |
||||
|
||||
AmazonCloudWatchLogsClient client = new AmazonCloudWatchLogsClient(basicAWSCredentials); |
||||
Regions regions = Regions.AP_SOUTHEAST_1; // Singapore
|
||||
client.setRegion(Region.getRegion(regions)); |
||||
|
||||
this.client = client; |
||||
} |
||||
|
||||
/** |
||||
* As you can see, the code is put into a Thread to run in background. |
||||
* The actual calls to CloudWatch have to be run in a background thread unless we turn off the checking. |
||||
*/ |
||||
public void log(String logGroupName, String logStreamName, String message) { |
||||
String fullLogStreamName = getPrefix() + logStreamName; |
||||
try { |
||||
Thread t = new Thread(() -> { |
||||
// Create LogGroup / LogStream (Will ignore if already created)
|
||||
createCloudWatchGroups(logGroupName, fullLogStreamName); |
||||
|
||||
// Prepare the LogMessage that you will send
|
||||
List<InputLogEvent> logEvents = new ArrayList<>(); |
||||
InputLogEvent log = new InputLogEvent(); |
||||
Calendar calendar = Calendar.getInstance(); |
||||
log.setTimestamp(calendar.getTimeInMillis()); |
||||
log.setMessage(message); |
||||
logEvents.add(log); |
||||
|
||||
// Check Cloudwatch for logStream if exist, to get the uploadSequenceToken.
|
||||
// Without this token you can still push events, but cannot push additional events to the an existing logGroup/logStream.
|
||||
// With the token, you can "append" the logStream (which we want).
|
||||
// https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeLogStreams.html
|
||||
DescribeLogStreamsRequest logStreamsRequest = new DescribeLogStreamsRequest(logGroupName); |
||||
|
||||
logStreamsRequest.withLimit(10); // Up to 50. Increase/Decrease depending on how many different streamNames you maintain
|
||||
|
||||
//logStreamsRequest.setLogStreamNamePrefix(getPrefix());
|
||||
|
||||
List<LogStream> logStreamList = client.describeLogStreams(logStreamsRequest).getLogStreams(); |
||||
|
||||
String token = null; |
||||
for (LogStream logStream : logStreamList) { |
||||
if (logStream.getLogStreamName().equalsIgnoreCase(fullLogStreamName)) { |
||||
token = logStream.getUploadSequenceToken(); |
||||
} |
||||
} |
||||
|
||||
PutLogEventsRequest putLogEventsRequest = new PutLogEventsRequest(); |
||||
putLogEventsRequest.setLogGroupName(logGroupName); |
||||
putLogEventsRequest.setLogStreamName(fullLogStreamName); |
||||
putLogEventsRequest.setLogEvents(logEvents); |
||||
|
||||
if (token != null) { |
||||
putLogEventsRequest.setSequenceToken(token); |
||||
} |
||||
|
||||
putLogEventsResult = client.putLogEvents(putLogEventsRequest); |
||||
Logger.logD("Pushed log to AWS Cloudwatch"); |
||||
}); |
||||
t.start(); |
||||
t.join(); |
||||
} catch (InterruptedException ignored) { |
||||
} |
||||
} |
||||
|
||||
private void createCloudWatchGroups(String logGroupName, String logStreamName) { |
||||
try { |
||||
Thread t = new Thread(() -> { |
||||
CreateLogGroupRequest createLogGroupRequest = new CreateLogGroupRequest(logGroupName); |
||||
try { |
||||
client.createLogGroup(createLogGroupRequest); |
||||
} catch (Exception e) { |
||||
if (e instanceof ResourceAlreadyExistsException) { |
||||
assert true; // do nothing
|
||||
} else { |
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
} |
||||
|
||||
CreateLogStreamRequest createLogStreamRequest = new CreateLogStreamRequest(logGroupName, logStreamName); |
||||
try { |
||||
client.createLogStream(createLogStreamRequest); |
||||
} catch (Exception e) { |
||||
if (e instanceof ResourceAlreadyExistsException) { |
||||
assert true; // do nothing
|
||||
} else { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
}); |
||||
t.start(); |
||||
t.join(); |
||||
} catch (InterruptedException ignored) { |
||||
} |
||||
} |
||||
|
||||
private String getPrefix() { |
||||
String dateString = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH).format(new Date()); |
||||
String kioskCode = BuildConfig.KIOSK_CODE; |
||||
|
||||
if (BuildConfig.FLAVOR != null && !BuildConfig.FLAVOR.isEmpty()) { |
||||
return dateString + "_IM30_" + kioskCode + "_" + BuildConfig.FLAVOR + "_"; |
||||
} else { |
||||
return dateString + "_IM30_" + kioskCode + "_"; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue