Utilize o Simple Log Service (SLS) SDK for Go para criar um projeto e um Logstore, configurar um índice, gravar logs e consultar os resultados.
Antes de começar
O SLS deve estar ativado. Activate Simple Log Service.
O SLS SDK for Go precisa estar inicializado. Initialize the Go SDK for Simple Log Service.
Procedimento
Etapa 1: Criar um projeto
Chame CreateProject para criar um projeto no SLS.
Parâmetro | Tipo | Obrigatório | Descrição | Exemplo |
projectName | string | Sim | Nome do projeto. Deve ser globalmente único dentro de uma região e não pode ser alterado após a criação. Regras de nomenclatura:
| test-project |
description | string | Sim | Descrição do projeto. | this is test |
// 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 a global name conflict in Alibaba Cloud 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)
}
Etapa 2: Criar um Logstore
Chame CreateLogStore para criar um Logstore no projeto.
Parâmetro | Tipo | Obrigatório | Descrição | Exemplo |
project | string | Sim | Nome do projeto. | ali-test-project |
logstoreName | string | Sim | Nome do Logstore. Deve ser exclusivo dentro do projeto. Regras de nomenclatura:
| my-logstore |
shardCount | int | Sim | Quantidade de shards. | 2 |
ttl | int | Sim | Período de retenção de dados em dias. Valores válidos: 1 a 3650. O valor 3650 indica retenção permanente. | 1 |
autoSplit | bool | Não | Ativa o particionamento automático. | true |
maxSplitShard | int | Não | Número máximo de shards para divisão automática. Valores válidos: 1 a 256. Obrigatório quando autoSplit é definido como true. | 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)
}
Etapa 3: Criar um índice
Chame CreateIndex para habilitar a consulta de logs no Logstore. Um índice possui duas partes:
Índice de campo (
Keys): Indexa campos específicos. Cadasls.IndexKeydefine os caracteres delimitadores (Token), a sensibilidade a maiúsculas e minúsculas (CaseSensitive) e o tipo de dado (Type).Índice de texto completo (
Line): Permite buscas de texto completo em todo o conteúdo do log. A estruturasls.IndexLineespecifica os caracteres delimitadores (Token), a sensibilidade a maiúsculas e minúsculas e listas opcionais de inclusão/exclusão de campos (IncludeKeys,ExcludeKeys).
O campo Token contém os caracteres delimitadores usados na segmentação de texto. O SLS divide o texto nesses delimitadores para gerar termos pesquisáveis.
// Create an index for the Logstore.
index := sls.Index{
// Field index.
Keys: map[string]sls.IndexKey{
"col_0": {
Token: []string{" "},
CaseSensitive: false,
Type: "long",
},
"col_1": {
Token: []string{",", ":", " "},
CaseSensitive: false,
Type: "text",
},
},
// Full-text index.
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)
}
Etapa 4: Gravar dados
Chame PutLogs para gravar dados de log no Logstore. Cada requisição envia um sls.LogGroup contendo um lote de entradas de log.
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
Exemplo |
|
project |
string |
Sim |
Projeto de destino. |
aliyun-test-project |
|
logstore |
string |
Sim |
Logstore de destino. |
aliyun-test-logstore |
|
topic |
string |
Não |
Tópico do log. Assume o valor padrão |
test |
|
source |
string |
Não |
Origem do log. Se omitido, assume o endereço IP do host produtor como padrão. |
203.0.113.10 |
|
content |
Slice |
Sim |
Log ou lista de logs a serem enviados. O log deve estar no formato LogItem. |
- |
O exemplo a seguir grava 10 grupos de logs, cada um contendo 100 logs com 10 campos (de col_0 a col_9), totalizando 1.000 logs.
// Write data 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)
}
Etapa 5: Consultar dados
Chame GetLogs para consultar dados de log. O comportamento da paginação varia conforme o tipo de instrução:
|
Tipo de instrução |
line |
offset |
reverse |
Como paginar |
|
Apenas consulta (por exemplo, |
Válido. Valor máximo: 100. Define o número máximo de logs retornados por requisição. |
Válido. Define a posição inicial. |
Válido. |
Defina |
|
Analítica (contém agregação ou transformação SQL) |
Defina como 0. |
Defina como 0. |
Defina como false. |
Utilize as cláusulas |
Referência de paginação: Paginar resultados de consulta e análise.
// Query logs.
// For a query-only statement, the line, offset, and reverse parameters are valid.
// For an analytic statement, set line to 0, offset to 0, and reverse to 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 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("======")
}
Código de exemplo completo
Crie um arquivo chamado SLSQuickStart.go com o código abaixo para executar todas as cinco etapas de ponta a ponta.
package main
import (
"fmt"
"log"
"math/rand"
"os"
"time"
sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/gogo/protobuf/proto"
)
func main() {
// SLS endpoint. This example uses the China (Hangzhou) region.
// Replace with your actual endpoint. Format: {region-id}.log.aliyuncs.com
Endpoint := "cn-hangzhou.log.aliyuncs.com"
// Obtain the AccessKey ID and AccessKey Secret from environment variables.
AccessKeyId := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
AccessKeySecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
// Temporary security token for the RAM role.
// An empty value means no temporary security token is used.
SecurityToken := ""
// Create an SLS 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 a global name conflict in Alibaba Cloud 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, 64)
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 an index for the Logstore.
index := sls.Index{
// Field index.
Keys: map[string]sls.IndexKey{
"col_0": {
Token: []string{" "},
CaseSensitive: false,
Type: "long",
},
"col_1": {
Token: []string{",", ":", " "},
CaseSensitive: false,
Type: "text",
},
},
// Full-text index.
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 data 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)
}
// Query logs.
// For a query-only statement, the line, offset, and reverse parameters are valid.
// The line parameter specifies the maximum number of logs to return per query (max 100).
// Use line and offset for paging. Example: first page line=100, offset=0;
// second page line=100, offset=100.
//
// For an analytic statement, set line to 0, offset to 0, and reverse to false.
// Use LIMIT, OFFSET, and ORDER BY in the SQL statement for pagination.
// Otherwise, an error is reported.
//
// For more information, see Paginate query and analysis results.
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("======")
}
}
Mais exemplos estão disponíveis no repositório Aliyun Log Go SDK.
Saída esperada
Saída esperada em caso de sucesso:
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
======
......
Próximos passos
Explore operações adicionais do SDK e padrões avançados de uso no repositório Aliyun Log Go SDK.
Saiba como inicializar o Go SDK for Simple Log Service com diferentes métodos de autenticação.