All Products
Search
Document Center

Simple Log Service:Get started with Simple Log Service SDK for Go

Last Updated:Nov 27, 2024

This topic describes how to get started with Simple Log Service SDK for Go and perform common operations. For example, you can create a project, create a Logstore, write logs, and query logs.

Prerequisites

Procedure

1. Create a project

Parameter

Type

Required

Description

Example

description

string

Yes

The description of the project.

this is test

projectName

string

Yes

The name must be unique in a region. You cannot change the name after the project is created. The name must meet the following requirements:

  • The name can contain only lowercase letters, digits, and hyphens (-).

  • The name must start and end with a lowercase letter or a digit.

  • The name must be 3 to 63 characters in length.

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. Create a Logstore

Parameter

Type

Required

Description

Example

project

string

Yes

The name of the project.

ali-test-project

logstoreName

string

Yes

The name of the Logstore. The name must meet the following requirements:

  • The name must be unique in a project.

  • The name can contain only lowercase letters, digits, hyphens (-), and underscores (_).

  • The name must start and end with a lowercase letter or a digit.

  • The name must be 3 to 63 characters in length.

my-logstore

shardCount

int

Yes

The number of shards.

2

ttl

int

Yes

The retention period of data. Unit: days. Valid values: 1 to 3650. If you set this parameter to 3650, data is permanently stored.

1

autoSplit

bool

No

Specifies whether to enable automatic sharding. Valid values:

  • true

  • false

true

maxSplitShard

int

No

The maximum number of shards into which existing shards can be automatically split. Valid values: 1 to 256.

Note

If you set the autoSplit parameter to true, you must configure the maxSplitShard parameter.

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. Write logs to the Logstore

Parameter

Type

Required

Description

project

string

Yes

The project.

logstore

string

Yes

The Logstore.

topic

string

No

The topic of the logs.

Note

If you leave this parameter empty, double quotation marks ("") are automatically used.

source

string

No

The source.

Note

If you leave this parameter empty, the IP address of the host where the producer resides is automatically used.

content

Slice

Yes

The logs that you want to write to the Logstore. Write logs in the LogItem format.

// 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)
	}

Sample code

In this example, a file named SLSQuickStart.go is created. The sample code in this file provides an example on how to call API operations to create a project, create a Logstore, create indexes, write logs, and query logs. Example:

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("======")
	}
}

For more information about the sample code, see Alibaba Cloud Simple Log Service SDK for Go.

Response

The following response is returned for the preceding example:

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