すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:Simple Log Service SDK for Goの使用を開始する

最終更新日:Dec 05, 2024

このトピックでは、Simple Log Service SDK for Goの使用を開始し、一般的な操作を実行する方法について説明します。 たとえば、プロジェクトの作成、Logstoreの作成、ログの書き込み、ログの照会ができます。

前提条件

手順

1. プロジェクトの作成

パラメーター

必須 / 任意

説明

説明

String

プロジェクトの説明。

これはテストです

projectName

String

名前はリージョン内で一意である必要があります。 プロジェクトの作成後に名前を変更することはできません。 名前の条件は以下の通りです。

  • 名前には、小文字、数字、ハイフン (-) のみを使用できます。

  • 名前の先頭と末尾は、小文字または数字である必要があります。

  • 名前の長さは 3 ~ 63 文字である必要があります。

test-project


	// Create a project. 
	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 already created or has an global name conflict in Aliyun scope", ProjectName)
		} else {
			log.Fatalf("Create project : %s failed %v", ProjectName, err)
			os.Exit(1)
		}
	} else {
		log.Printf("Project : %s created successfully", project.Name)
		time.Sleep(60 * time.Second)
	}

2. Logstoreを作成するCreate a Logstore

パラメーター

必須 / 任意

説明

project

String

プロジェクトの名前。

ali-test-project

logstoreName

String

ログストアの名前 名前の条件は以下の通りです。

  • 名前はプロジェクト内で一意である必要があります。

  • 名前には、小文字、数字、ハイフン ( - )、アンダースコア ( _ ) のみ使用できます。

  • 名前の先頭と末尾は、小文字または数字である必要があります。

  • 名前の長さは 3 ~ 63 文字である必要があります。

my-logstore

shardCount

int

シャードの数。

2

ttl

int

データの保持期間。 単位:日 有効な値: 1 ~ 3650 このパラメーターを3650に設定すると、データは永続的に保存されます。

1

autoSplit

bool

不可

自動シャーディングを有効にするかどうかを指定します。 有効な値:

  • true

  • false

true

maxSplitShard

int

不可

既存のシャードを自動的に分割できるシャードの最大数。 有効な値: 1 ~ 256

説明

autoSplitパラメーターをtrueに設定する場合は、maxSplitShardパラメーターを設定する必要があります。

64

// Create a Logstore. 
	LogStoreName := "aliyun-test-logstore"
	var ttl, shardCnt, maxSplitShard int = 3, 2, 64
	var autoSplit bool = true
	err = client.CreateLogStore(ProjectName, LogStoreName, ttl, shardCnt, autoSplit, maxSplitShard)
	if err != nil {
		if e, ok := err.(*sls.Error); ok && e.Code == "LogStoreAlreadyExist" {
			log.Printf("Logstore : %s already created", LogStoreName)
		} else {
			log.Fatalf("Create LogStore : %s failed %v", LogStoreName, err)
			os.Exit(1)
		}
	} else {
		log.Printf("Create logstore : %v successfully", LogStoreName)
		time.Sleep(10 * time.Second)
	}

3. インデックスの作成Create indexes

// Create indexes for the Logstore. 
	index := sls.Index{
		// Field indexing. 
		Keys: map[string]sls.IndexKey{
			"col_0": {
				Token:         []string{" "},
				CaseSensitive: false,
				Type:          "long",
			},
			"col_1": {
				Token:         []string{",", ":", " "},
				CaseSensitive: false,
				Type:          "text",
			},
		},
		// Full-text indexing. 
		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("Index : already created")
		} else {
			log.Fatalf("Create Index failed %v", err)
			os.Exit(1)
		}
	} else {
		log.Println("CreateIndex success")
		time.Sleep(60 * time.Second)
	}

4。 Logstoreへのログの書き込み

パラメーター

必須 / 任意

説明

project

String

プロジェクト。

logstore

String

Logstore。

topic

String

不可

ログのトピック。

説明

このパラメーターを空のままにすると、二重引用符 ("") が自動的に使用されます。

source

String

不可

ソース。

説明

このパラメーターを空のままにすると、プロデューサーが存在するホストのIPアドレスが自動的に使用されます。

content

スライス

Logstoreに書き込むログ。 LogItem形式でログを書き込みます。

// Write logs to the 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.x.x"),
			Logs:   logs,
		}

		err = client.PutLogs(ProjectName, LogStoreName, loggroup)
		if err != nil {
			log.Fatalf("PutLogs failed %v", err)
			os.Exit(1)
		}
		log.Println("PutLogs success")
		time.Sleep(time.Second)
	}

サンプルコード

この例では、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() {
	// The Simple Log Service endpoint. In this example, the Simple Log Service endpoint for the China (Hangzhou) region is used. Replace the parameter value with the actual endpoint. 
	Endpoint := "cn-hangzhou.log.aliyuncs.com"

	// In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 
	AccessKeyId := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
	AccessKeySecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
	// The STS token of the RAM user. If you leave this parameter empty, no STS tokens are used. 
	SecurityToken := ""
	// Create a Simple Log Service client. 
	provider := sls.NewStaticCredentialsProvider(AccessKeyId, AccessKeySecret, SecurityToken)
	client := sls.CreateNormalInterfaceV2(Endpoint, provider)

	// Create a project. 
	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 already created or has an global name conflict in Aliyun scope", ProjectName)
		} else {
			log.Fatalf("Create project : %s failed %v", ProjectName, err)
			os.Exit(1)
		}
	} else {
		log.Printf("Project : %s created successfully", project.Name)
		time.Sleep(60 * time.Second)
	}

	// Create a 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 already created", LogStoreName)
		} else {
			log.Fatalf("Create LogStore : %s failed %v", LogStoreName, err)
			os.Exit(1)
		}
	} else {
		log.Printf("Create logstore : %v successfully", LogStoreName)
		time.Sleep(10 * time.Second)
	}

	// Create indexes for the Logstore. 
	index := sls.Index{
		// Field indexing. 
		Keys: map[string]sls.IndexKey{
			"col_0": {
				Token:         []string{" "},
				CaseSensitive: false,
				Type:          "long",
			},
			"col_1": {
				Token:         []string{",", ":", " "},
				CaseSensitive: false,
				Type:          "text",
			},
		},
		// Full-text indexing. 
		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("Index : already created")
		} else {
			log.Fatalf("Create Index failed %v", err)
			os.Exit(1)
		}
	} else {
		log.Println("CreateIndex success")
		time.Sleep(60 * time.Second)
	}

	// Write logs to the 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 failed %v", err)
			os.Exit(1)
		}
		log.Println("PutLogs success")
		time.Sleep(time.Second)
	}

	// Execute an SQL statement to query logs. 
	// If the query statement includes only a search statement, the values of the line, offset, and reverse parameters take effect. The line parameter specifies the maximum number of logs that can be returned. Maximum value: 100. The offset parameter specifies the start position of the returned logs. To paginate logs, you can configure the line and offset parameters. 
	// For example, you can set the line parameter to 100 and the offset parameter to 0 for the first query statement, and set the line parameter to 100 and the offset parameter to 100 for the second query statement. 
	// If the query statement includes an analytic statement, the values of the line, offset, and reverse parameters do not take effect. The number of logs that are returned is determined by the LIMIT, OFFSET, and ORDER BY clauses. We recommend that you set the values of the line, offset, and reverse parameters to 0, 0, and false, respectively. If you specify other values for the parameters, errors are reported. 
	// For more information, see Paged query. 
	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 failed %v", err)
		os.Exit(1)
	}
	log.Printf("Get %d logs", 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("======")
	}
}

サンプルコードの詳細については、「Alibaba Cloud Simple Log Service SDK For Go」をご参照ください。

レスポンス

上記の例では、次のレスポンスが返されます。

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
======
......