tencent cloud

Cloud Log Service

Demo-多言語SDKの利用

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-10-12 14:51:42
AI翻訳
本文では、Python、Javaを使用してCLSログを消費する方法を紹介します。

Python SDK

説明:
Pythonバージョン3.9以降の使用を推奨します。
Python kafkaクライアント:kafka-python、kafka-python-ng、confluent-kafka-python。
データ圧縮形式を設定した場合:形式がSNAPPYの場合は、python-snappyパッケージがインストールされていることを確認してください。形式がLZ4の場合は、lz4パッケージがインストールされていることを確認してください。

単一コンシューマー

import uuid
from kafka import KafkaConsumer,TopicPartition,OffsetAndMetadata
consumer = KafkaConsumer(
# cls kafkaプロトコルで消費するコンソールで提供されるトピック名です。例えばXXXXXX-633a268c-XXXX-4a4c-XXXX-7a9a1a7baXXXXは、コンソールでコピーできます。
お客様の消費トピック、
group_id = 'お客様のコンシューマーグループ名'、
auto_offset_reset='earliest',
# サービスアドレス+ポート。外部ネットワークポートは9096、内部ネットワークポートは9095です。例は内部ネットワークでの消費です。お客様の実際の状況に応じて入力してください。
bootstrap_servers = ['kafkaconsumer-${region}.cls.tencentyun.com:9095'],
security_protocol = "SASL_PLAINTEXT",
sasl_mechanism = 'PLAIN',
# ユーザー名はログセットIDです。例えばca5cXXXXdd2e-4ac0af12-92d4b677d2c6です。
sasl_plain_username = "${logsetID}",
# パスワードはユーザーのSecretId#SecretKeyを組み合わせた文字列です。例えばAKID********************************#XXXXuXtymIXT0Lacです。#を失わないように注意してください。サブアカウントキーの使用を推奨します。メインアカウントがサブアカウントに権限を付与する際は、最小権限の原則に従います。つまり、サブアカウントのアクセスポリシーにおけるaction、resourceをすべて最小範囲に設定し、操作を満たせば十分です。
sasl_plain_password = "${SecretId}#${SecretKey}",
api_version = (0,10,1)
)
print('begin')
for message in consumer:
print('begins')
print ("Topic:[%s] Partition:[%d] Offset:[%d] Value:[%s]" % (message.topic, message.partition, message.offset, message.value))
print('end')

複数コンシューマー

from kafka import KafkaConsumer
import threading

TOPIC_NAME = 'お客様の消費トピック'
GROUP_ID = 'お客様のコンシューマーグループ名'
# サービスアドレス+ポート。外部ネットワークポートは9096、内部ネットワークポートは9095です。例は内部ネットワークでの消費です。お客様の実際の状況に応じて入力してください。
BOOTSTRAP_SERVERS = ''kafkaconsumer-${region}.cls.tencentyun.com:9095''

def consume_messages(thread_id):
# Kafkaコンシューマーインスタンスを作成します。
consumer = KafkaConsumer(
TOPIC_NAME,
group_id=GROUP_ID,
bootstrap_servers=BOOTSTRAP_SERVERS,
value_deserializer=lambda m: m.decode('utf-8'),
auto_offset_reset='earliest',
security_protocol = "SASL_PLAINTEXT",
sasl_mechanism = 'PLAIN',
sasl_plain_username = "${logsetID}",
sasl_plain_password = "${SecretId}#${SecretKey}",
api_version = (2, 5, 1)
)

try:
for message in consumer:
print(f"Thread {thread_id}: partition = {message.partition}, offset = {message.offset}, value = {message.value}")
except KeyboardInterrupt:
pass
finally:
# コンシューマーを閉じます。
consumer.close()

if __name__ == "__main__":
# 3つのコンシューマースレッドを起動します。これは例です。お客様の実際の状況に応じて設定してください。
num_consumers = 3
threads = []
for i in range(num_consumers):
thread = threading.Thread(target=consume_messages, args=(i,))
threads.append(thread)
thread.start()

# すべてのスレッドが終了するのを待ちます。
for thread in threads:
thread.join()

Java SDK

注意:
以下の例のJavaコードでは、jaas.configの設定において、${SecretId}#${SecretKey}の後に(; セミコロン)があります。漏れずに入力してください。そうしないとエラーが発生します。
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.5.0</version>
</dependency>
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class KafkaConsumerGroupTest {

public static void consume() {
Properties props = new Properties();
String logset_id = "${logsetID}";
// CLSコンソールのkafkaプロトコル消費ページに表示されるトピック名
String topic_id = "お客様の消費トピック";

String accessKeyID = System.getenv("${SecretId}");
String accessKeySecret = System.getenv("${SecretKey}");

String groupId = "お客様のコンシューマーグループ名";

// サービスアドレス+ポート。外部ネットワークポートは9096、内部ネットワークポートは9095です。例は内部ネットワークでの消費です。お客様の実際の状況に応じて入力してください。
String hosts = "kafkaconsumer-${region}.cls.tencentyun.com:9095";
props.put("bootstrap.servers", hosts);
props.put("security.protocol", "SASL_PLAINTEXT");
props.put("sasl.mechanism", "PLAIN");
props.put("sasl.jaas.config",
"org.apache.kafka.common.security.plain.PlainLoginModule required username=\\"" +
logset_id + "\\" password=\\"" + accessKeyID + "#" + accessKeySecret + "\\";");

// Kafkaコンシューマー設定
props.put("group.id", groupId);
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "5000");
props.put("session.timeout.ms", "10000");
props.put("auto.offset.reset", "earliest");
props.put("max.poll.interval.ms", "120000");
props.put("heartbeat.interval.ms", "3000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

// Kafkaコンシューマーインスタンスを作成します。
KafkaConsumer<String,String> consumer = new KafkaConsumer<String,String>(props);
consumer.subscribe(Collections.singletonList(topic_id));
while(true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(10000));
for (ConsumerRecord<String, String> record : records) {
System.out.println("Received message: (" + record.key() + ", " + record.value() + ") at offset " + record.offset());
}
}
}
public static void main(String[] args){
consume();
}
}

Go SDK

注意:
以下の例のJavaコードでは、jaas.configの設定において、${SecretId}#${SecretKey}の後に(; セミコロン)があります。漏れずに入力してください。そうしないとエラーが発生します。
package main

import (
"context"
"fmt"
"github.com/Shopify/sarama"
"log"
"os"
"os/signal"
"syscall"
)

func main() {
// Saramaコンシューマー設定を作成します。
//TOPIC_NAMEはお客様の消費トピックです。コンソールで確認してください。
topicName := "${TOPIC_NAME}"
//GROUP_ID はお客様のコンシューマーグループ名です。
groupID := "${GROUP_ID}"
//BOOTSTRAP_SERVERSは消費サービスアドレス+ポートです。外部ネットワークポートは9096、内部ネットワークポートは9095です。例えば、kafkaconsumer-${region}.cls.tencentyun.com:9095です。
endpoint := "${BOOTSTRAP_SERVERS"
config := sarama.NewConfig()
config.Net.SASL.Enable = true
config.Net.SASL.User = "${logsetID}"
config.Net.SASL.Password = "${SecretId}#${SecretKey}"
config.Net.SASL.Mechanism = sarama.SASLTypePlaintext
config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRoundRobin
config.Version = sarama.V1_1_1_0
config.Consumer.Offsets.Initial = sarama.OffsetNewest

// Saramaコンシューマーを作成します。
sarama.Logger = log.New(os.Stdout, "[Sarama] ", log.LstdFlags)
consumer, err := sarama.NewConsumerGroup([]string{endpoint}, groupID, config)
if err != nil {
log.Fatal(err)
}
defer consumer.Close()

// 受信したメッセージを処理します。
handler := &ConsumerGroupHandler{}
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)

go func() {
for {
err := consumer.Consume(context.Background(), []string{topicName}, handler)
if err != nil {
log.Fatal(err)
}
if handler.ready {
break
}
}
}()

<-signals
fmt.Println("Exiting...")
}

// ConsumerGroupHandlerはsarama.ConsumerGroupHandlerインターフェースを実装しています。
type ConsumerGroupHandler struct {
ready bool
}

// Setupはコンシューマーグループの起動前に呼び出されます。
func (h *ConsumerGroupHandler) Setup(sarama.ConsumerGroupSession) error {
h.ready = true
return nil
}

// Cleanupはコンシューマーグループの停止後に呼び出されます。
func (h *ConsumerGroupHandler) Cleanup(sarama.ConsumerGroupSession) error {
h.ready = false
return nil
}

// ConsumeClaimはClaim内のメッセージを消費します。
func (h *ConsumerGroupHandler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
for message := range claim.Messages() {
fmt.Printf("Received message: %s\\n", string(message.Value))
session.MarkMessage(message, "")
}
return nil
}


ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック