Ich baue einen kleinen Protokoll-Tracker für meine Anwendung mit Amazon Cloud Watch-Dienst. Die Idee ist nicht Track-Log-Ausgaben auf Dateien und verwenden Sie die Suchmaschine von AWS-Konsole, um Log-Informationen zu finden.Amazon Cloud Watch-Protokoll - PutLogEventsRequest - Die angegebene SequenzToken ist ungültig
Ich verwende:
- Eclipse als IDE
- Java 8
- Abhängigkeiten: aws-java-sdk-core/aws-java-sdk-Cloudwatch V 1.10.49
In der anderen Seite habe ich folgende AWS-Konfiguration:
- A ccess und private Schlüssel
- Region: California
- Log Gruppe: demo1
- Log-Stream: stream1
ich den folgenden Code zu schreiben einen einfachen Funktionstest zu machen:
package com.test.pe.cloudwatch;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.logs.AWSLogsClient;
import com.amazonaws.services.logs.model.InputLogEvent;
import com.amazonaws.services.logs.model.PutLogEventsRequest;
import com.amazonaws.services.logs.model.PutLogEventsResult;
import com.test.pe.base.CredentialBuilder;
public class RegisterLog {
private static String LOG_GROUP = "demo1";
private static String LOG_STREAM = "stream1";
public static void main(String[] args) throws ParseException {
// building my credential and calendar instances
AWSCredentials credential = CredentialBuilder.getCredential();
Calendar calendar = Calendar.getInstance();
// building a cloud watch log client
AWSLogsClient cloudWatchlog = new AWSLogsClient(credential);
cloudWatchlog.setRegion(Region.getRegion(Regions.US_WEST_1));
// building a put request log
PutLogEventsRequest request = new PutLogEventsRequest();
request.setLogGroupName(LOG_GROUP);
request.setLogStreamName(LOG_STREAM);
// building my log event
InputLogEvent log = new InputLogEvent();
log.setMessage("Some message for a test");
log.setTimestamp(calendar.getTimeInMillis());
// building the array list log event
ArrayList<InputLogEvent> logEvents = new ArrayList<InputLogEvent>();
logEvents.add(log);
// setting the error array list
request.setLogEvents(logEvents);
// make the request
cloudWatchlog.putLogEvents(request);
System.out.println("done!");
}
}
Wenn ich den Code zum ersten Mal ausführe, ist alles ok, die Nachricht wird erfolgreich gespeichert.
Allerdings, wenn ich den Code für eine zweite Mal, dass ich die folgende Ausnahme erhalten ausführen:
Exception in thread "main" com.amazonaws.services.logs.model.InvalidSequenceTokenException: The given sequenceToken is invalid. The next expected sequenceToken is: xxxxxxxxxxxxxxxxxxxxxxxxxxx (Service: AWSLogs; Status Code: 400; Error Code: InvalidSequenceTokenException; Request ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1389)
XXXXXXXXXXX: Sind Token von amazon erzeugten Codes.
Lesen der amazon Dokumentation und ich fand das folgende Info:
anfordern Syntax:
{
"LogEvents": [
{
"Message": "string",
"Timestamp": number
}
],
"LogGroupName": "string",
"LogStreamName": "string",
"SequenceToken": "string"
}
SequenceToken
A string token that must be obtained from the response of the previous PutLogEvents request.
Type: String
Length constraints: Minimum length of 1.
Required: No
amazon documentation about cloud watch log REST API
und ich beschlossen, hart Code der Sequenz Token auf meinem Code wie folgt:
request.setSequenceToken("58523.......");
Es funktioniert gut. Und ich habe es nur zum Testen gemacht.
Schließlich war die einzige Möglichkeit, die ich gefunden, um die Sequenz Token zu bekommen war.
PutLogEventsResult response = cloudWatchlog.putLogEvents(request);
String token = response.getNextSequenceToken();
Wie kann ich überprüfen, und erhalten Sie den Sequenzcode vor eine Anfrage machen ?. Ich kann das auf der Dokumentation nicht finden.
ist es auch ein guter Weg – afym