Simple Log Service (SLS) SDK for Java を使用して、プロジェクト、Logstore、インデックスを作成し、ログの書き込みとクエリを実行します。
前提条件
開始する前に、以下が準備できていることを確認してください。
Java Runtime Environment (JRE) 6.0 以降がインストールされていること。
java -versionを実行して、ご利用のバージョンを確認します。 Java がインストールされていない場合は、Java の公式サイトからダウンロードしてください。SLS SDK for Java がインストール済みであること。手順については、「SLS SDK for Java をインストールする」をご参照ください。
Alibaba Cloud コンソールで作成し、環境変数として保存した AccessKey ID と AccessKey Secret:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<your-access-key-id> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-access-key-secret>
ステップ 1:クライアントの初期化
このチュートリアルのすべての操作では、共有の Client インスタンスを使用します。 エンドポイントによって、リクエストを処理するリージョンが決まります。
import com.aliyun.openservices.log.Client;
public class SlsQuickStart {
// 環境変数から認証情報を取得
static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// 中国 (杭州) の SLS エンドポイント。 ご利用のリージョンのエンドポイントに置き換えてください。
static String host = "cn-hangzhou.log.aliyuncs.com";
static Client client = new Client(host, accessId, accessKey);
}cn-hangzhou.log.aliyuncs.com をご利用のリージョンのエンドポイントに置き換えてください。 エンドポイントのフォーマットは <region-id>.log.aliyuncs.com です。
ステップ 2:プロジェクトの作成
プロジェクトは、SLS における最上位のリソースコンテナーです。 すべての Logstore、インデックス、ダッシュボードはプロジェクトに属します。
static String projectName = "aliyun-test-gs-project";
static void createProject() throws LogException, InterruptedException {
String projectDescription = "project description";
System.out.println("ready to create project");
client.CreateProject(projectName, projectDescription);
System.out.println(String.format("create project %s success", projectName));
// プロジェクトが作成後に完全に利用可能になるまで待機
TimeUnit.SECONDS.sleep(60 * 2);
}この 2 分間の待機時間は、プロジェクトが作成後に完全に利用可能になるまでに必要な時間を考慮したものです。 本番環境では、固定のスリープ時間の代わりに、ポーリングまたはリトライロジックを使用してください。
ステップ 3:Logstore の作成
Logstore は、プロジェクト内でログデータを収集、保存、クエリするための単位です。 各 Logstore には、設定可能なデータ保存期間とシャード数があります。
static String logstoreName = "aliyun-test-logstore";
static void createLogstore() throws LogException, InterruptedException {
System.out.println("ready to create logstore");
int ttlInDay = 3; // データ保存期間 (日数)。 永続的に保存する場合は 3650 に設定します。
int shardCount = 2; // 読み取り/書き込みスループットのためのシャード数
LogStore store = new LogStore(logstoreName, ttlInDay, shardCount);
client.CreateLogStore(projectName, store);
System.out.println(String.format("create logstore %s success", logstoreName));
// Logstore が利用可能になるまで待機
TimeUnit.SECONDS.sleep(60);
}| パラメーター | 説明 | 例 |
|---|---|---|
ttlInDay | データ保存期間 (日数)。 永続的に保存する場合は 3650 に設定します。 | 3 |
shardCount | シャード数。 シャード数を増やすと、読み取り/書き込みのスループットが向上します。 | 2 |
ステップ 4:インデックスの作成
インデックスを作成すると、Logstore でのログ検索と分析が可能になります。 この例では、dev フィールドと id フィールドに対して、フルテキストインデックスとフィールドインデックスの両方を作成します。
static void createIndex() throws LogException, InterruptedException {
System.out.println(String.format("ready to create index for %s", logstoreName));
// インデックス設定:
// - 標準的なトークナイザー (コンマ、スペース、引用符、括弧など) を使用したフルテキストインデックス
// - "dev" (テキスト型) と "id" (long 型) のフィールドインデックス
// - 大文字と小文字を区別しない、中国語のトークン分割は無効、最大テキスト長 2048
String logstoreIndex = "{\"line\": {\"token\": [\",\", \" \", \"'\", \"\\\"\", \";\", \"=\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", \"?\", \"@\", \"&\", \"<\", \">\", \"/\", \":\", \"\\n\", \"\\t\", \"\\r\"], \"caseSensitive\": false, \"chn\": false}, \"keys\": {\"dev\": {\"type\": \"text\", \"token\": [\",\", \" \", \"'\", \"\\\"\", \";\", \"=\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", \"?\", \"@\", \"&\", \"<\", \">\", \"/\", \":\", \"\\n\", \"\\t\", \"\\r\"], \"caseSensitive\": false, \"alias\": \"\", \"doc_value\": true, \"chn\": false}, \"id\": {\"type\": \"long\", \"alias\": \"\", \"doc_value\": true}}, \"log_reduce\": false, \"max_text_len\": 2048}";
Index index = new Index();
index.FromJsonString(logstoreIndex);
client.CreateIndex(projectName, logstoreName, index);
System.out.println(String.format("create index for %s success", logstoreName));
// インデックスが利用可能になるまで待機
TimeUnit.SECONDS.sleep(60);
}インデックスの JSON は、以下の設定を構成します。
| 設定 | 値 | 説明 |
|---|---|---|
| フルテキストインデックスのトークン | , ' " ; = ( ) [ ] { } ? @ & < > / : \n \t \r | ログテキストをトークン化するための区切り文字 |
caseSensitive | false | 大文字と小文字を区別しない検索 |
chn | false | 中国語のトークン分割は無効 |
dev フィールド | text | 分析が有効なテキストフィールド (doc_value: true) |
id フィールド | long | 分析が有効な数値フィールド (doc_value: true) |
max_text_len | 2048 | インデックス作成のための最大テキスト長 |
ステップ 5:ログデータの書き込み
100 個のサンプルログ項目を Logstore に書き込みます。 各ログ項目には、id フィールドと dev フィールドが含まれています。
static void pushLogs() throws LogException, InterruptedException {
System.out.println(String.format("ready to push logs for %s", logstoreName));
List<LogItem> logGroup = new ArrayList<LogItem>();
for (int i = 0; i < 100; ++i) {
LogItem logItem = new LogItem();
logItem.PushBack("id", String.valueOf(i));
logItem.PushBack("dev", "test_push");
logGroup.add(logItem);
}
client.PutLogs(projectName, logstoreName, "", logGroup, "");
System.out.println(String.format("push logs for %s success", logstoreName));
// ログがインデックス付けされるまで少し待機
TimeUnit.SECONDS.sleep(5);
}PutLogs は、小規模なシナリオに適しています。 高スループットまたは高同時実行のワークロードの場合は、バッチ処理、リトライ、非同期送信機能を提供する Alibaba Cloud Log Java Producer を使用してください。ステップ 6:ログのクエリ
SQL クエリを実行して、1 時間のウィンドウ内で Logstore からログを取得します。
static String query = "*| select * from " + logstoreName;
static void queryLogs() throws LogException {
System.out.println(String.format("ready to query logs from %s", logstoreName));
// 直近 1 時間をクエリします。 fromTime と toTime は UNIX タイムスタンプ (秒) です。
int fromTime = (int) (System.currentTimeMillis() / 1000 - 3600);
int toTime = fromTime + 3600;
GetLogsResponse getLogsResponse = client.GetLogs(projectName, logstoreName, fromTime, toTime, "", query);
for (QueriedLog log : getLogsResponse.getLogs()) {
for (LogContent mContent : log.mLogItem.mContents) {
System.out.println(mContent.mKey + " : " + mContent.mValue);
}
System.out.println("********************");
}
}完全なコード
以下の例は、これまでのすべてのステップを 1 つの実行可能なプログラムにまとめたものです。 SlsQuickStart.java という名前のファイルを作成し、以下のコードを貼り付けてください。
import com.aliyun.openservices.log.common.Index;
import com.aliyun.openservices.log.common.LogContent;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.common.LogStore;
import com.aliyun.openservices.log.common.QueriedLog;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.response.GetLogsResponse;
import com.aliyun.openservices.log.Client;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SlsQuickStart {
// 環境変数から認証情報を取得
static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// 中国 (杭州) の SLS エンドポイント。 ご利用のリージョンのエンドポイントに置き換えてください。
static String host = "cn-hangzhou.log.aliyuncs.com";
static Client client = new Client(host, accessId, accessKey);
static String projectName = "aliyun-test-gs-project";
static String logstoreName = "aliyun-test-logstore";
static String query = "*| select * from " + logstoreName;
static void createProject() throws LogException, InterruptedException {
String projectDescription = "project description";
System.out.println("ready to create project");
client.CreateProject(projectName, projectDescription);
System.out.println(String.format("create project %s success", projectName));
TimeUnit.SECONDS.sleep(60 * 2);
}
static void createLogstore() throws LogException, InterruptedException {
System.out.println("ready to create logstore");
int ttlInDay = 3;
int shardCount = 2;
LogStore store = new LogStore(logstoreName, ttlInDay, shardCount);
client.CreateLogStore(projectName, store);
System.out.println(String.format("create logstore %s success", logstoreName));
TimeUnit.SECONDS.sleep(60);
}
static void createIndex() throws LogException, InterruptedException {
System.out.println(String.format("ready to create index for %s", logstoreName));
String logstoreIndex = "{\"line\": {\"token\": [\",\", \" \", \"'\", \"\\\"\", \";\", \"=\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", \"?\", \"@\", \"&\", \"<\", \">\", \"/\", \":\", \"\\n\", \"\\t\", \"\\r\"], \"caseSensitive\": false, \"chn\": false}, \"keys\": {\"dev\": {\"type\": \"text\", \"token\": [\",\", \" \", \"'\", \"\\\"\", \";\", \"=\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", \"?\", \"@\", \"&\", \"<\", \">\", \"/\", \":\", \"\\n\", \"\\t\", \"\\r\"], \"caseSensitive\": false, \"alias\": \"\", \"doc_value\": true, \"chn\": false}, \"id\": {\"type\": \"long\", \"alias\": \"\", \"doc_value\": true}}, \"log_reduce\": false, \"max_text_len\": 2048}";
Index index = new Index();
index.FromJsonString(logstoreIndex);
client.CreateIndex(projectName, logstoreName, index);
System.out.println(String.format("create index for %s success", logstoreName));
TimeUnit.SECONDS.sleep(60);
}
static void pushLogs() throws LogException, InterruptedException {
System.out.println(String.format("ready to push logs for %s", logstoreName));
List<LogItem> logGroup = new ArrayList<LogItem>();
for (int i = 0; i < 100; ++i) {
LogItem logItem = new LogItem();
logItem.PushBack("id", String.valueOf(i));
logItem.PushBack("dev", "test_push");
logGroup.add(logItem);
}
client.PutLogs(projectName, logstoreName, "", logGroup, "");
System.out.println(String.format("push logs for %s success", logstoreName));
TimeUnit.SECONDS.sleep(5);
}
static void queryLogs() throws LogException {
System.out.println(String.format("ready to query logs from %s", logstoreName));
int fromTime = (int) (System.currentTimeMillis() / 1000 - 3600);
int toTime = fromTime + 3600;
GetLogsResponse getLogsResponse = client.GetLogs(projectName, logstoreName, fromTime, toTime, "", query);
for (QueriedLog log : getLogsResponse.getLogs()) {
for (LogContent mContent : log.mLogItem.mContents) {
System.out.println(mContent.mKey + " : " + mContent.mValue);
}
System.out.println("********************");
}
}
public static void main(String[] args) throws LogException, InterruptedException {
createProject();
createLogstore();
createIndex();
pushLogs();
queryLogs();
}
}想定される出力
SlsQuickStart.java を実行すると、コンソールに以下が出力されます。
ready to create project
create project aliyun-test-gs-project success
ready to create logstore
create logstore aliyun-test-logstore success
ready to create index for aliyun-test-logstore
create index for aliyun-test-logstore success
ready to push logs for aliyun-test-logstore
push logs for aliyun-test-logstore success
ready to query logs from aliyun-test-logstore
dev : test_push
id : 0
********************
dev : test_push
id : 1
********************
dev : test_push
id : 2
********************
...実際のクエリ出力には、__line__、__topic__、__time___0などのシステムメタデータフィールドが含まれる場合もあります。