Simple Log Service は、ログ消費 API を含む複数のプログラミング言語向けの SDK を提供しています。このトピックでは、Java SDK を使用してログを消費する方法の例を示します。
背景情報
PullLogs 操作を呼び出して、指定したカーソル位置からログデータを取得できます。Simple Log Service は、Java、Python、Go で記述されたアプリケーションが、個々のコンシューマーとして、またはコンシューマーグループの一部としてデータを消費することをサポートしています。
Simple Log Service は、リアルタイム消費、スキャンベースのクエリ、Logtail 収集など、複数のシナリオで SPL をサポートしています。詳細については、「SPL 構文」をご参照ください。
Java SDK を使用したログの消費
Simple Log Service 用の Java SDK がインストールされていることを確認してください。詳細については、「Java SDK のインストール」をご参照ください。
SDK による消費
この例では、PullLogs 操作を呼び出してログデータを読み取る方法を示します。
パラメーター
|
パラメーター
|
タイプ
|
必須
|
説明
|
|
project
|
string
|
はい
|
プロジェクト名:プロジェクトは Simple Log Service のリソース管理ユニットです。マルチユーザー分離とアクセス制御の主要な境界として機能します。詳細については、「プロジェクトの管理」をご参照ください。
|
|
Logstore
|
string
|
はい
|
Logstore 名:Logstore は、Simple Log Service でログデータを収集、保存、クエリするためのユニットです。詳細については、「Logstore の管理」をご参照ください。
|
|
shardId
|
int
|
はい
|
Logstore 内のシャードの ID。
|
Maven 依存関係の追加
プロジェクトのルートディレクトリにある pom.xml ファイルに、次の依存関係を追加します。
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log</artifactId>
<version>0.6.99</version>
</dependency>
PullLogsDemo.java ファイルの作成
サンプルコード:
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.Consts;
import com.aliyun.openservices.log.common.LogGroupData;
import com.aliyun.openservices.log.common.Shard;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PullLogsRequest;
import com.aliyun.openservices.log.response.ListShardResponse;
import com.aliyun.openservices.log.response.PullLogsResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PullLogsDemo {
// Simple Log Service のエンドポイント。この例では、中国 (杭州) リージョンのエンドポイントが使用されています。他のリージョンの場合は、実際のエンドポイントに置き換えてください。
private static final String endpoint = "cn-hangzhou.log.aliyuncs.com";
// 環境変数から AccessKey ID と AccessKey Secret を読み取ります。
private static final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static final String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// プロジェクト名。
private static final String project = "your_project";
// Logstore 名。
private static final String logStore = "your_logstore";
public static void main(String[] args) throws Exception {
// Simple Log Service クライアントを作成します。
Client client = new Client(endpoint, accessKeyId, accessKeySecret);
// Logstore 内のシャードを一覧表示します。
ListShardResponse resp = client.ListShard(project, logStore);
System.out.printf("%s has %d shards\n", logStore, resp.GetShards().size());
Map<Integer, String> cursorMap = new HashMap<Integer, String>();
for (Shard shard : resp.GetShards()) {
int shardId = shard.getShardId();
// シャードの先頭から消費を開始するためのカーソルを取得します。末尾から開始するには、Consts.CursorMode.END を使用します。
cursorMap.put(shardId, client.GetCursor(project, logStore, shardId, Consts.CursorMode.BEGIN).GetCursor());
}
try {
while (true) {
// 各シャードからログをプルします。
for (Shard shard : resp.GetShards()) {
int shardId = shard.getShardId();
PullLogsRequest request = new PullLogsRequest(project, logStore, shardId, 1000, cursorMap.get(shardId));
PullLogsResponse response = client.pullLogs(request);
// ログは LogGroup 形式で返されます。ビジネスロジックに基づいて処理できます。
List<LogGroupData> logGroups = response.getLogGroups();
System.out.printf("Get %d logGroup from logStore:%s:\tShard:%d\n", logGroups.size(), logStore, shardId);
// プルしたログを処理した後、次のプルのためにカーソルを保存します。
cursorMap.put(shardId, response.getNextCursor());
}
}
} catch (LogException e) {
System.out.println("error code :" + e.GetErrorCode());
System.out.println("error message :" + e.GetErrorMessage());
throw e;
}
}
}
SPL による消費
この例では、PullLogs 操作を呼び出すときに SPL を使用してログデータをフィルターする方法を示します。
パラメーター
|
パラメーター
|
タイプ
|
必須
|
説明
|
|
project
|
string
|
はい
|
プロジェクト名:プロジェクトは Simple Log Service のリソース管理ユニットです。マルチユーザー分離とアクセス制御の主要な境界として機能します。詳細については、「プロジェクトの管理」をご参照ください。
|
|
Logstore
|
string
|
はい
|
Logstore 名:Logstore は、Simple Log Service でログデータを収集、保存、クエリするためのユニットです。詳細については、「Logstore の管理」をご参照ください。
|
|
shardId
|
int
|
はい
|
Logstore 内のシャードの ID。
|
Maven 依存関係の追加
プロジェクトのルートディレクトリにある pom.xml ファイルに、次の依存関係を追加します。
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log</artifactId>
<version>0.6.99</version>
</dependency>
PullLogsWithSPLDemo.java ファイルの作成
サンプルコード:
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.*;
import com.aliyun.openservices.log.common.Consts;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PullLogsRequest;
import com.aliyun.openservices.log.response.ListShardResponse;
import com.aliyun.openservices.log.response.PullLogsResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PullLogsWithSPLDemo {
// Simple Log Service のエンドポイント。この例では、中国 (杭州) リージョンのエンドポイントが使用されています。他のリージョンの場合は、実際のエンドポイントに置き換えてください。
private static final String endpoint = "cn-hangzhou.log.aliyuncs.com";
// 環境変数から AccessKey ID と AccessKey Secret を読み取ります。
private static final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static final String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// プロジェクト名。
private static final String project = "your_project";
// Logstore 名。
private static final String logStore = "your_logstore";
public static void main(String[] args) throws Exception {
// Simple Log Service クライアントを作成します。
Client client = new Client(endpoint, accessKeyId, accessKeySecret);
// Logstore 内のシャードを一覧表示します。
ListShardResponse resp = client.ListShard(project, logStore);
System.out.printf("%s has %d shards\n", logStore, resp.GetShards().size());
Map<Integer, String> cursorMap = new HashMap<Integer, String>();
for (Shard shard : resp.GetShards()) {
int shardId = shard.getShardId();
// シャードの先頭から消費を開始するためのカーソルを取得します。末尾から開始するには、Consts.CursorMode.END を使用します。
cursorMap.put(shardId, client.GetCursor(project, logStore, shardId, Consts.CursorMode.BEGIN).GetCursor());
}
try {
while (true) {
// 各シャードからログをプルします。
for (Shard shard : resp.GetShards()) {
int shardId = shard.getShardId();
PullLogsRequest request = new PullLogsRequest(project, logStore, shardId, 1000, cursorMap.get(shardId));
request.setQuery("* | where cast(body_bytes_sent as bigint) > 14000");
request.setPullMode("scan_on_stream");
PullLogsResponse response = client.pullLogs(request);
// ログは LogGroup 形式で返されます。ビジネスロジックに基づいて処理できます。
List<LogGroupData> logGroups = response.getLogGroups();
System.out.printf("Get %d logGroup from logStore:%s:\tShard:%d\n", logGroups.size(), logStore, shardId);
// プルしたログを処理した後、次のプルのためにカーソルを保存します。
cursorMap.put(shardId, response.getNextCursor());
}
}
} catch (LogException e) {
System.out.println("error code :" + e.GetErrorCode());
System.out.println("error message :" + e.GetErrorMessage());
throw e;
}
}
}