如何通过循环获取亚马逊中的所有日志事件



每个amazon API都有自己的令牌,您必须将其设置为下一个请求。但有了aws-log-api,我得到了无限循环:

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);
}
}

来自文件:

nextBackwardToken

向后方向上的下一组项目的标记。令牌将在24小时后过期。此令牌永远不会为null。如果您已经到达流的末尾,它将返回您传入的相同令牌。

因此,当您扫描dynamodb:时,它不能像LastEvaluatedKey那样为null

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);

那么,如果我们谈论日志api,我应该向request.withNextToken传递什么???如果nextBackwardToken(以及nextForwardToken)不能为空-如何检测我收到了来自亚马逊的最后一个响应???

您引用的文档非常简单。我想你需要这样的东西:

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);

所以,您只需要每次使用新令牌创建请求,直到它与旧令牌相等。

最新更新