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

Simple Log Service:Go SDK クイックスタート

最終更新日:Feb 12, 2026

このトピックでは、Go 用 Simple Log Service (SLS) SDK を使用して一般的な操作を実行する方法について説明します。これらの操作には、プロジェクトの作成、Logstore の作成、ログの書き込み、ログのクエリが含まれます。

前提条件

操作手順

1. プロジェクトの作成

名前

タイプ

必須

説明

description

string

はい

プロジェクトの説明。

this is test

projectName

string

はい

プロジェクト名。この名前は Alibaba Cloud リージョン内でグローバルに一意である必要があり、プロジェクト作成後に変更することはできません。名前は次のルールに従う必要があります。

  • 小文字、数字、ハイフン (-) のみを含めることができます。

  • 小文字または数字で開始および終了する必要があります。

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

test-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 はすでに作成されているか、Aliyun スコープでグローバル名の競合が発生しています", ProjectName)
		} else {
			log.Fatalf("プロジェクト %s の作成に失敗しました %v", ProjectName, err)
			os.Exit(1)
		}
	} else {
		log.Printf("プロジェクト %s が正常に作成されました", project.Name)
		time.Sleep(60 * time.Second)
	}

2. Logstore の作成

名前

タイプ

必須

説明

project

string

はい

プロジェクト名。

ali-test-project

logstoreName

string

はい

Logstore の名前。名前は次のルールに従う必要があります。

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

  • 小文字、数字、ハイフン (-)、アンダースコア (_) のみを含めることができます。

  • 小文字または数字で開始および終了する必要があります。

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

my-logstore

shardCount

int

はい

シャード数。

2

ttl

int

はい

データ保持期間 (日数)。有効値: 1 ~ 3650。3650 の値は永続的な保持を指定します。

1

autoSplit

bool

いいえ

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

  • true: 自動シャーディングを有効にします。

  • false: 自動シャーディングを無効にします。

true

maxSplitShard

int

いいえ

自動分割の最大シャード数。最小値は 1、最大値は 256 です。

説明

このパラメーターは、autoSplit が true に設定されている場合に必須です。

64

	// 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 はすでに作成されています", LogStoreName)
		} else {
			log.Fatalf("Logstore %s の作成に失敗しました %v", LogStoreName, err)
			os.Exit(1)
		}
	} else {
		log.Printf("Logstore %v が正常に作成されました", LogStoreName)
		time.Sleep(10 * time.Second)
	}

3. インデックスの作成

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

4. データの書き込み

パラメーター

タイプ

必須

説明

project

string

はい

宛先プロジェクト。

logstore

string

はい

宛先 Logstore。

topic

string

いいえ

ログ Topic。

説明

このパラメーターが指定されていないか空の場合、値は "" に設定されます。

source

string

いいえ

ソースを送信します。

説明

このパラメーターが指定されていないか空の場合、プロデューサーが実行されているホストの IP アドレスが使用されます。

content

Slice

はい

送信するログまたはログのリスト。ログは LogItem 形式である必要があります。

	// 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 に失敗しました %v", err)
			os.Exit(1)
		}
		log.Println("PutLogs が正常に実行されました")
		time.Sleep(time.Second)
	}

5. データのクエリ

重要

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

サンプルコード

この例では、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
======
......