Todos os produtos
Search
Central de documentação

:Use o Aliyun Log Go Producer para gravar logs no Simple Log Service

Última atualização: Jul 04, 2026

Se você precisar compactar logs e enviá-los ao Simple Log Service para reduzir o uso de recursos de transmissão de rede ao utilizar mecanismos de computação de big data como Flink, Spark e Storm, a API e o SDK do Simple Log Service não são recomendados, pois não atendem aos requisitos de gravação de dados em cenários de big data. Nesses casos, use o Aliyun Log Go Producer para enviar logs ao Simple Log Service de forma eficiente.

Pré-requisitos

Introdução ao Aliyun Log Go Producer

O Aliyun Log Go Producer é uma biblioteca de alto desempenho desenvolvida para aplicações Go em cenários de big data e alta concorrência. Em comparação com a API e o SDK do Simple Log Service, o Aliyun Log Go Producer oferece múltiplos benefícios relacionados à gravação de logs, como alto desempenho, isolamento lógico entre computação e I/O, e gerenciamento de recursos. O Aliyun Log Go Producer utiliza o recurso de gravação sequencial do Simple Log Service para garantir a ordem de envio dos logs.

O fluxograma a seguir ilustra o funcionamento do Aliyun Log Go Producer:

image

Limites

  • O mecanismo subjacente do Aliyun Log Go Producer chama a operação PutLogs para enviar logs. O tamanho dos logs brutos enviados a cada vez é limitado. Para mais informações, consulte Leitura e gravação de dados.

  • Os recursos básicos do Simple Log Service, como projetos, logstores, shards e grupos de máquinas, também possuem limitações. Para mais informações, consulte Limites de recursos básicos.

  • Na primeira vez que executar o código, ative o recurso de indexação para o seu logstore no console do Simple Log Service. Em seguida, aguarde cerca de um minuto antes de consultar os logs.

  • Ao consultar logs no console do Simple Log Service, se o comprimento do valor de um campo nos logs retornados exceder o limite máximo, o valor do campo será truncado e a parte excedente não será usada para análise. Para mais informações, consulte Criar índices.

1. Configure a estrutura de dados ProducerConfig

producerConfig := producer.GetDefaultProducerConfig()
producerConfig.Endpoint = "cn-hangzhou.log.aliyuncs.com"
provider := sls.NewStaticCredentialsProvider(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), "")
producerConfig.CredentialsProvider = provider

Use a estrutura de dados ProducerConfig para configurar uma política de envio. Configure os parâmetros conforme o cenário. A tabela a seguir descreve os parâmetros disponíveis.

Parameter

Type

Description

TotalSizeLnBytes

Int64

O tamanho máximo de logs que uma instância do producer pode armazenar em cache. Valor padrão: 100 MB.

MaxIoWorkerCount

Int64

O número máximo de goroutines que uma instância do producer executa de forma concorrente. Valor padrão: 50. Configure este parâmetro de acordo com o desempenho do seu servidor.

MaxBlockSec

Int

O tempo máximo de bloqueio quando o método send é chamado, mas o espaço disponível da instância do producer é insuficiente. Valor padrão: 60 segundos.

Se o tempo máximo de bloqueio especificado expirar e o espaço disponível da instância ainda for insuficiente, o método send lança o erro TimeoutException. Se você definir este parâmetro como 0 e o espaço disponível for insuficiente, o método send lança imediatamente o erro TimeoutException. Para bloquear o método send até que haja espaço suficiente na instância do producer, defina este parâmetro com um valor negativo.

MaxBatchSize

Int64

O tamanho máximo de logs armazenados em cache em uma coleção ProducerBatch. Quando esse tamanho for maior ou igual ao valor deste parâmetro, os logs são entregues ao Simple Log Service. Valor padrão: 512 KB. Valor máximo: 5 MB.

MaxBatchCount

Int

O número máximo de logs armazenados em cache em uma coleção ProducerBatch. Quando esse número for maior ou igual ao valor deste parâmetro, os logs são entregues ao Simple Log Service. Valor padrão: 4096. Valor máximo: 40960.

LingerMs

Int64

A duração entre a criação de uma coleção ProducerBatch e a entrega dos seus logs ao Simple Log Service. Valor padrão: 2 segundos. Valor mínimo: 100 milissegundos.

Retries

Int

O número de tentativas de reenvio dos logs de uma coleção ProducerBatch ao Simple Log Service após a primeira falha. Valor padrão: 10.

Se o valor deste parâmetro for menor ou igual a 0, os logs entram na fila de falhas após a primeira falha de envio.

MaxReservedAttempts

Int

O número máximo de tentativas retornadas. O sistema registra o número de tentativas de entrega dos logs de uma coleção ProducerBatch. Por padrão, apenas as 11 tentativas mais recentes são retornadas.

Um valor maior permite rastrear mais detalhes, porém consome mais recursos de memória.

BaseRetryBackoffMs

Int64

O tempo de backoff para a primeira nova tentativa. Valor padrão: 100 milissegundos. A instância do producer usa o algoritmo de backoff exponencial. O tempo de backoff para a N-ésima tentativa obedece à seguinte fórmula: valor do parâmetro BaseRetryBackoffMs × 2^(N - 1).

MaxRetryBackoffMs

Int64

O tempo máximo de backoff para uma nova tentativa. Valor padrão: 50 segundos.

AdjustShardHash

Bool

Especifica se o parâmetro shardHash deve ser modificado quando configurado ao chamar o método send. Valor padrão: true.

Buckets

Int

O número de buckets nos quais os dados são agrupados. Este parâmetro só tem efeito quando o parâmetro AdjustShardHash está definido como true. Nesse caso, a instância do producer agrupa os dados automaticamente em buckets com base no valor do parâmetro shardHash.

Se duas entradas de dados tiverem valores diferentes para o parâmetro shardHash, elas não poderão ser agrupadas no mesmo bucket para upload, o que reduz o throughput da instância do producer. Após o agrupamento, o sistema tende a enviar os dados ao Simple Log Service em lotes com maior frequência. Valores válidos: [1, 256]. O valor deste parâmetro deve ser uma potência inteira de 2. Valor padrão: 64.

CredentialsProvider

Interface

A interface para obter dinamicamente um AccessKey ID, um AccessKey secret e um token do Security Token Service (STS). Configure este parâmetro conforme as necessidades do seu negócio. Essa interface deve armazenar em cache o par de AccessKey retornado e garantir a segurança de threads.

NoRetryStatusCodeList

[ ]int

Os códigos de erro retornados para requisições que não precisam de nova tentativa. Se um log falhar ao ser enviado ao Simple Log Service e um código de erro especificado for retornado, a requisição não é reenviada. Valores padrão: 400 e 404.

UpdateStsToken

Func

A função que permite ao Aliyun Log Go Producer atualizar automaticamente os tokens STS e adicioná-los à instância do producer.

StsTokenShutDown

channel

O canal de comunicação para desativar a atualização automática de tokens STS. Ao desativar o canal, os tokens STS deixam de ser atualizados automaticamente. Se a instância do producer for encerrada e o valor deste parâmetro não for nil, a instância chama o método close para desativar o canal de comunicação, interrompendo assim a atualização automática.

Region

String

A região onde o Simple Log Service está implantado. Este parâmetro é obrigatório quando o parâmetro AuthVersion está definido como AuthV4. Exemplo: cn-hangzhou.

AuthVersion

String

A versão de assinatura. Valores válidos: AuthV1 e AuthV4. Para exemplos de assinatura AuthV4, consulte producer_test.go.

UseMetricStoreURL

bool

A URL do Metricstore a ser utilizada para entregar logs ao Simple Log Service, o que melhora o desempenho de consulta em cenários com grande volume de séries temporais.

2. Inicie uma instância do producer

Ao chamar a função producerInstance.Start(), uma goroutine é iniciada para monitorar se os logs estão sendo gravados na instância do producer e se existem grupos de logs que atendem às condições de envio. Quando isso ocorre, a goroutine entrega os grupos de logs correspondentes ao Logstore do Simple Log Service especificado.

producerInstance, err := producer.NewProducer(producerConfig)
if err != nil {
  panic(err)
}
ch := make(chan os.Signal)
signal.Notify(ch, os.Kill, os.Interrupt)
producerInstance.Start()

3. Chame um método send para entregar logs ao Simple Log Service

Neste exemplo, o método HashSendLogListWithCallBack é chamado para entregar logs. A tabela a seguir descreve os parâmetros relacionados.

Parameter

Required

Description

project

Yes

O projeto.

logStore

Yes

O Logstore.

shardHash

No

O valor de hash para os logs a serem entregues. Especifique um valor de hash conforme as necessidades do seu negócio. Após especificar um valor de hash, os logs são gravados em um shard específico do Logstore indicado com base nesse valor.

Nota

Se você não configurar este parâmetro, os logs serão gravados aleatoriamente em um shard do Logstore especificado.

topic

No

O tópico dos logs.

Nota

Se você não configurar este parâmetro, aspas duplas ("") serão usadas automaticamente.

source

No

A origem dos logs.

Nota

Se você não configurar este parâmetro, o endereço IP do host onde a instância do producer está instalada será usado automaticamente.

logs

Yes

Os logs a serem entregues ao Logstore.

callback

No

A função de callback. Essa função é chamada quando os logs são entregues ao Simple Log Service ou quando não conseguem ser entregues após múltiplas tentativas e são descartados.

Nota

Chame o método producer.GenerateLog() para criar um log a ser entregue a um Logstore de forma simples. No entanto, o processo de geração é ineficiente. Recomenda-se chamar a operação sls.Log para criar um log. Exemplo:

	var m sync.WaitGroup
	callBack := &Callback{}
	logs := []*sls.Log{}
	content := []*sls.LogContent{}
	for colIdx := 0; colIdx < 10; colIdx++ {
		if colIdx/2 == 0 {
			content = append(content, &sls.LogContent{
				Key:   tea.String("request_method"),
				Value: tea.String("GET"),
			}, &sls.LogContent{
				Key:   tea.String("status"),
				Value: tea.String("200"),
			})
		} else if colIdx/3 == 0 {
			content = append(content, &sls.LogContent{
				Key:   tea.String("request_method"),
				Value: tea.String("POST"),
			}, &sls.LogContent{
				Key:   tea.String("status"),
				Value: tea.String("500"),
			})
		} else {
			content = append(content, &sls.LogContent{
				Key:   tea.String("request_method"),
				Value: tea.String("POST"),
			}, &sls.LogContent{
				Key:   tea.String("status"),
				Value: tea.String("200"),
			})
		}
	}
	log := &sls.Log{
		Time:     proto.Uint32(uint32(time.Now().Unix())),
		Contents: content,
	}
	logs = append(logs, log)
	shardHash := ""
	for i := 0; i < 10; i++ {
		m.Add(1)
		go func() {
			defer m.Done()
			for i := 0; i < 1000; i++ {
				// GenerateLog  is producer's function for generating SLS format logs
				// GenerateLog has low performance, and native Log interface is the best choice for high performance.
				err := producerInstance.HashSendLogListWithCallBack("gs-log-test", "gstest", shardHash, "topic", "127.0.X.1", logs, callBack)
				if err != nil {
					fmt.Println(err)
				}
			}
		}()
	}
	fmt.Println("Send completion")

4. Encerre uma instância do producer

Há dois modos de encerramento: encerramento limitado e encerramento seguro.

  • Encerramento seguro: neste modo, a instância do producer é encerrada somente após todos os dados em cache serem entregues ao Simple Log Service.

  • Encerramento limitado: neste modo, a instância do producer recebe um valor de parâmetro em segundos. Após receber esse valor, uma contagem regressiva é iniciada. Se o tempo especificado expirar sem que a instância do producer seja completamente encerrada, ela será forçada a encerrar. Nesse caso, alguns dados podem não ser entregues e serem perdidos.

producerInstance.Close(60) // The limited shutdown. You must specify a positive integer for this parameter. Unit: seconds.
producerInstance.SafeClose()// The safe shutdown.

Referências

  • Se a resposta retornada pelo Simple Log Service contiver informações de erro após a chamada de uma operação de API, a chamada falhou. Corrija o erro com base na descrição do código de erro da operação de API correspondente. Para mais informações, consulte Códigos de erro.

  • Para mais informações sobre código de exemplo, consulte Aliyun Log Go Producer no Github.