0

Jede Amazon API hat ein eigenes Token, das Sie auf die nächste Anfrage einstellen müssen. Aber mit aws api log habe ich unendlich Schleife:Wie erhalten alle Log-Ereignisse in Amazon via Loop?

public class Some { 
    public static void main (String[] args) { 
     final GetLogEventsRequest request = new GetLogEventsRequest() 
       .withLogGroupName("myGroup") 
       .withLogStreamName("myStrean"); 
     final AWSLogs awsLogs = AWSLogsClientBuilder.defaultClient(); 
     Collection<OutputLogEvent> result = new ArrayList<>(); 

     GetLogEventsResult response = null; 
     do { 
      response = awsLogs.getLogEvents(request); 
      result.addAll(response.getEvents()); 
      request.withNextToken(response.getNextBackwardToken()); 
     } while (response.getNextBackwardToken() != null); 
    } 
} 

Aus Dokumentation:

nextBackwardToken

Das Token für den nächsten Satz von Elementen in der Rückwärtsrichtung. Das Token läuft nach 24 Stunden ab. Dieses Token wird niemals null sein. Wenn Sie das Ende des Streams erreicht haben, wird es das gleiche Token kehren Sie in geben

So kann es wie LastEvaluatedKey nicht null sein, wenn Sie scan DynamoDB.

Map<String, AttributeValue> lastKeyEvaluated = null; 
do { 
    ScanRequest scanRequest = new ScanRequest() 
     .withTableName("ProductCatalog") 
     .withLimit(10) 
     .withExclusiveStartKey(lastKeyEvaluated); 

    ScanResult result = client.scan(scanRequest); 
    for (Map<String, AttributeValue> item : result.getItems()){ 
     printItem(item); 
    } 
    lastKeyEvaluated = result.getLastEvaluatedKey(); 
} while (lastKeyEvaluated != null); 

So und was ich sollte an request.withNextToken übergeben, wenn wir über log api ??? sprechen Und wenn nextBackwardToken (und nextForwardToken auch) kann nicht null sein - wie zu erkennen, dass ich die letzte Antwort von Amazon bekomme ???

+0

Sie müssen sehen, ob die Token die gleichen sind; Wenn sie es sind, dann bist du am Ende des Streams. –

+0

Das gleiche - Sie meinen Token von vorherigen und nächsten Antworten oder? – Cherry

+0

Ja. Wenn sie gleich sind, dann sind Sie am Ende des Streams. –

Antwort

0

Die Dokumentation, die Sie zitiert haben, ist ziemlich einfach. Ich glaube, Sie so etwas wie dieses brauchen:

final AWSLogs awsLogs = AWSLogsClientBuilder.defaultClient(); 
    Collection<OutputLogEvent> result = new ArrayList<>(); 

    String nextToken = null; 
    GetLogEventsResult response; 
    do { 
     GetLogEventsRequest request = new GetLogEventsRequest() 
       .withLogGroupName("myGroup") 
       .withLogStreamName("myStrean"); 
     if (nextToken != null) request = request.withNextToken(nextToken); 

     response = awsLogs.getLogEvents(request); 
     result.addAll(response.getEvents()); 

     // check if token is the same 
     if (response.getNextForwardToken().equals(nextToken)) break; 
     // save new token 
     nextToken = response.getNextForwardToken(); 
    } while (true); 

So müssen Sie einfach Anfrage jedes Mal mit dem neuen Token erstellen, bis er gleich dem alten wird.

Verwandte Themen