Amazon Cloud Watch サービスを使用して、アプリケーション用の小さなログ トラッカーを構築しています。アイデアは、ファイルのログ出力を追跡し、aws コンソールから検索エンジンを使用してログ情報を見つけることではありません。
私は使っている:
- IDEとしてのEclipse
- Java 8
- 依存関係: aws-java-sdk-core / aws-java-sdk-cloudwatch V 1.10.49
一方、次の AWS 構成があります。
- アクセスと秘密鍵
- 地域 : カリフォルニア
- ロググループ: demo1
- ログストリーム: stream1
簡単な機能テストを行うために、次のコードを書いていました。
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!");
}
}
初めてコードを実行すると、すべて問題なく、メッセージが正常に保存されます。
ただし、コードを 2 回目に実行すると、次の例外が発生します。
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)
XXXXXXXXXXXX : Amazon によって生成されたトークン コードです。
Amazonのドキュメントを読んで、次の情報を見つけました。
リクエスト構文:
{
"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
クラウド ウォッチ ログ REST API に関する amazon ドキュメント
そして、次のようにコードにシーケンス トークンをハードコーディングすることにしました。
request.setSequenceToken("58523.......");
それは正常に動作します。そして、私はただテストのためにそれを作りました。
最後に、シーケンス トークンを取得する唯一の方法は次のとおりでした。
PutLogEventsResult response = cloudWatchlog.putLogEvents(request);
String token = response.getNextSequenceToken();
リクエストを行う前にシーケンス コードを検証して取得するにはどうすればよいですか? ドキュメントでそれを見つけることができません。