このトピックでは、Go 用 Simple Log Service (SLS) SDK を使用して一般的な操作を実行する方法について説明します。これらの操作には、プロジェクトの作成、Logstore の作成、ログの書き込み、ログのクエリが含まれます。
前提条件
-
Simple Log Service がアクティブ化されていること。詳細については、「」および「Simple Log Service のアクティブ化」をご参照ください。
-
Go 用 Simple Log Service SDK が初期化されていること。詳細については、「Simple Log Service 用 Go SDK の初期化」をご参照ください。
操作手順
1. プロジェクトの作成
2. Logstore の作成
3. インデックスの作成
4. データの書き込み
5. データのクエリ
サンプルコード
この例では、SLSQuickStart.go ファイルを作成し、API 操作を呼び出してプロジェクトの作成、Logstore の作成、インデックスの作成、データの書き込み、およびデータのクエリを実行します。次のコードは例を示しています。
package main
import (
"fmt"
"log"
"math/rand"
"os"
"time"
sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/gogo/protobuf/proto"
)
func main() {
// Simple Log Service のエンドポイント。この例では、中国 (杭州) リージョンのエンドポイントを使用しています。値を実際のエンドポイントに置き換えてください。
Endpoint := "cn-hangzhou.log.aliyuncs.com"
// この例では、環境変数から AccessKey ID と AccessKey Secret を取得します。
AccessKeyId := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
AccessKeySecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
// RAM ユーザーロールの一時セキュリティトークン。空の値は、一時セキュリティトークンが使用されていないことを示します。
SecurityToken := ""
// Simple Log Service クライアントを作成します。
provider := sls.NewStaticCredentialsProvider(AccessKeyId, AccessKeySecret, SecurityToken)
client := sls.CreateNormalInterfaceV2(Endpoint, provider)
// プロジェクトを作成します。
ProjectName := "aliyun-test-project"
Description := "test"
project, err := client.CreateProject(ProjectName, Description)
if err != nil {
if e, ok := err.(*sls.Error); ok && e.Code == "ProjectAlreadyExist" {
log.Printf("Project : %s はすでに作成されているか、Aliyun スコープでグローバル名の競合が発生しています", ProjectName)
} else {
log.Fatalf("プロジェクト %s の作成に失敗しました %v", ProjectName, err)
os.Exit(1)
}
} else {
log.Printf("プロジェクト %s が正常に作成されました", project.Name)
time.Sleep(60 * time.Second)
}
// Logstore を作成します。
LogStoreName := "aliyun-test-logstore"
err = client.CreateLogStore(ProjectName, LogStoreName, 3, 2, true, 6)
if err != nil {
if e, ok := err.(*sls.Error); ok && e.Code == "LogStoreAlreadyExist" {
log.Printf("Logstore : %s はすでに作成されています", LogStoreName)
} else {
log.Fatalf("Logstore %s の作成に失敗しました %v", LogStoreName, err)
os.Exit(1)
}
} else {
log.Printf("Logstore %v が正常に作成されました", LogStoreName)
time.Sleep(10 * time.Second)
}
// Logstore のインデックスを作成します。
index := sls.Index{
// フィールドインデックス。
Keys: map[string]sls.IndexKey{
"col_0": {
Token: []string{" "},
CaseSensitive: false,
Type: "long",
},
"col_1": {
Token: []string{",", ":", " "},
CaseSensitive: false,
Type: "text",
},
},
// 全文インデックス。
Line: &sls.IndexLine{
Token: []string{",", ":", " "},
CaseSensitive: false,
IncludeKeys: []string{},
ExcludeKeys: []string{},
},
}
err = client.CreateIndex(ProjectName, LogStoreName, index)
if err != nil {
if e, ok := err.(*sls.Error); ok && e.Code == "IndexAlreadyExist" {
log.Printf("インデックスはすでに作成されています")
} else {
log.Fatalf("インデックスの作成に失敗しました %v", err)
os.Exit(1)
}
} else {
log.Println("CreateIndex が正常に実行されました")
time.Sleep(60 * time.Second)
}
// Logstore にデータを書き込みます。
for loggroupIdx := 0; loggroupIdx < 10; loggroupIdx++ {
logs := []*sls.Log{}
for logIdx := 0; logIdx < 100; logIdx++ {
content := []*sls.LogContent{}
for colIdx := 0; colIdx < 10; colIdx++ {
if colIdx == 0 {
content = append(content, &sls.LogContent{
Key: proto.String(fmt.Sprintf("col_%d", colIdx)),
Value: proto.String(fmt.Sprintf("%d", rand.Intn(10000000))),
})
} else {
content = append(content, &sls.LogContent{
Key: proto.String(fmt.Sprintf("col_%d", colIdx)),
Value: proto.String(fmt.Sprintf("loggroup idx: %d, log idx: %d, col idx: %d, value: %d", loggroupIdx, logIdx, colIdx, rand.Intn(10000000))),
})
}
}
log := &sls.Log{
Time: proto.Uint32(uint32(time.Now().Unix())),
Contents: content,
}
logs = append(logs, log)
}
loggroup := &sls.LogGroup{
Topic: proto.String("test"),
Source: proto.String("203.0.113.10"),
Logs: logs,
}
err = client.PutLogs(ProjectName, LogStoreName, loggroup)
if err != nil {
log.Fatalf("PutLogs に失敗しました %v", err)
os.Exit(1)
}
log.Println("PutLogs が正常に実行されました")
time.Sleep(time.Second)
}
// SQL を使用してログをクエリします。
// ステートメントにクエリ文のみが含まれている場合、line、offset、および reverse パラメーターは有効です。line パラメーターは、クエリごとに返されるログの最大数を指定します。最大値は 100 です。offset パラメーターは開始位置を指定します。line および offset パラメーターはページングに使用できます。
// たとえば、最初のクエリでは、line を 100、offset を 0 に設定します。2 番目のクエリでは、line を 100、offset を 100 に設定します。
// ステートメントに分析文が含まれている場合、line、offset、および reverse パラメーターは無効です。結果は、分析文の limit、offset、および order by 句によって決定されます。この場合、line を 0、offset を 0、reverse を false に設定します。そうしないと、エラーが報告されます。
// 詳細については、「クエリと分析結果のページング」をご参照ください。
response, err := client.GetLogs(ProjectName, LogStoreName, "test", time.Now().Unix()-1800, time.Now().Unix(), "* and col_0 > 9000000", 100, 1, true)
if err != nil {
log.Fatalf("GetLogs に失敗しました %v", err)
os.Exit(1)
}
log.Printf("%d 個のログを取得しました", response.Count)
logs := response.Logs
for i := range logs {
for k, v := range logs[i] {
log.Printf("key: %s, value: %s", k, v)
}
log.Println("======")
}
}その他のサンプルコードについては、「Aliyun Log Go SDK」をご参照ください。
結果
次のコードは結果の例を示しています。
Project : aliyun-test-project created successfully.
Create logstore : aliyun-test-logstore successfully.
CreateIndex success
PutLogs success
PutLogs success
PutLogs success
PutLogs success
PutLogs success
PutLogs success
PutLogs success
PutLogs success
PutLogs success
PutLogs success
Get 61 logs
key: source, value: 203.0.113.10
key: time, value: 1627282116
key: col_0, value: 9886757
key: col_1, value: loggroup idx: 6, log idx: 87, col idx: 1, value: 2673724
key: col_2, value: loggroup idx: 6, log idx: 87, col idx: 2, value: 5822012
key: col_8, value: loggroup idx: 6, log idx: 87, col idx: 8, value: 3996746
key: topic, value: test
key: col_9, value: loggroup idx: 6, log idx: 87, col idx: 9, value: 7646111
key: col_3, value: loggroup idx: 6, log idx: 87, col idx: 3, value: 8872632
key: col_4, value: loggroup idx: 6, log idx: 87, col idx: 4, value: 1839836
key: col_5, value: loggroup idx: 6, log idx: 87, col idx: 5, value: 6967415
key: col_6, value: loggroup idx: 6, log idx: 87, col idx: 6, value: 5872057
key: col_7, value: loggroup idx: 6, log idx: 87, col idx: 7, value: 3227909
======
......