tencent cloud

Cloud Log Service

Demoの利用 - 利用前フィルタリング

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-10-12 14:51:42
AI翻訳
この操作ドキュメントでは、Python SDKを使用してログデータの事前フィルタリングと消費を実装する方法を説明します。

環境準備

SDK完全な例:continuous_sample_consumer。
Pythonバージョン:Python 3.5以降のバージョンを使用することを推奨します。

コアロジックの説明

データ構造体 (LogGroup)

コンシューマーは消費されたデータを処理し、ユーザーのログデータはlog_group構造体に保存されます。
log_group {
source //ログソース、通常はマシンのIPです
filename //ログファイル名
logs {
time //ログ時間、unixタイムスタンプ、マイクロ秒レベル
user_defined_log_kvs //ユーザーログフィールド
}
}

コンシューマーメソッドの実装 (SampleConsumer)

ConsumerProcessorBaseクラスを継承して具体的なログ処理ロジックを定義します。
class SampleConsumer(ConsumerProcessorBase):
last_check_time = 0

def initialize(self, topic_id):
self.topic_id = topic_id

def process(self, log_groups, offset_tracker):
for log_group in log_groups:
for log in log_group.logs:
# 単一行データの処理
item = dict()
item['filename'] = log_group.filename
item['source'] = log_group.source
item['time'] = log.time
for content in log.contents:
item[content.key] = content.value

# Subsequent data processing
# put your business logic here
print(json.dumps(item))

# offset commit
current_time = time.time()
if current_time - self.last_check_time > 3:
try:
self.last_check_time = current_time
offset_tracker.save_offset(True)
except Exception:
import traceback
traceback.print_exc()
else:
try:
offset_tracker.save_offset(False)
except Exception:
import traceback
traceback.print_exc()

return None

消費タスクの起動

設定のポイント:
事前フィルタリング設定:queryパラメータを設定することで実現します。設定しない場合、デフォルトで全量消費が行われます。
並列処理の推奨事項:消費性能を確保するために、コンシューマー数はログ主题のパーティション(Partition)数と一致させる必要があります。
Demoにはコンシューマーが1つしかありません。コンシューマー数はログ主题のパーティション数と一致させることをお勧めします。
class App:
def __init__(self):
self.shutdown_flag = False
# access endpoint
self.endpoint = os.environ.get('TENCENTCLOUD_LOG_SAMPLE_ENDPOINT', '')
# region
self.region = os.environ.get('TENCENTCLOUD_LOG_SAMPLE_REGION', '')
# secret id
self.access_key_id = os.environ.get(
'TENCENTCLOUD_LOG_SAMPLE_ACCESSID', '')
# secret key
self.access_key = os.environ.get(
'TENCENTCLOUD_LOG_SAMPLE_ACCESSKEY', '')
# logset id
self.logset_id = os.environ.get(
'TENCENTCLOUD_LOG_SAMPLE_LOGSET_ID', '')
# topic ids
self.topic_ids = os.environ.get(
'TENCENTCLOUD_LOG_SAMPLE_TOPICS', '').split(',')
# 事前フィルタリング条件(queryパラメータを設定することで事前フィルタリング後に消費します。このパラメータを設定しない場合は全量のログを消費します)
# queryの例:log_keep(op_and(op_gt(v("status"), 400), str_exist(v("cdb_message"), "pwd")))
# 実現される効果:statusが400より大きく、かつcdb_messageフィールドに「pwd」が含まれるログのみを消費します。
self.query = 'お客様のフィルタリング条件'
# consumer group name,
self.consumer_group = 'consumer-group-1'
# consumer id、お客様のコンシューマー数=ログ主题のパーティション数を推奨します。
self.consumer_name1 = "consumer-group-1-A"
assert self.endpoint and self.access_key_id and self.access_key and self.logset_id, ValueError("endpoint/access_id/access_key and "
"logset_id cannot be empty")
signal.signal(signal.SIGTERM, self.signal_handler)
signal.signal(signal.SIGINT, self.signal_handler)

def signal_handler(self, signum, frame):
print(f"catch signal {signum}、cleanup...")
self.shutdown_flag = True

def run(self):
print("*** start to run consumer...")
self.consume()
# waiting for exit signal
while not self.shutdown_flag:
time.sleep(1)
# shutdown consumer
print("*** stopping workers")
self.consumer.shutdown()
sys.exit(0)

def consume(self):
try:
# consumer config
option1 = LogHubConfig(self.endpoint, self.access_key_id, self.access_key, self.region, self.logset_id, self.topic_ids, self.consumer_group,
self.consumer_name1, heartbeat_interval=3, data_fetch_interval=1,
offset_start_time='begin', max_fetch_log_group_size=1048576,query=self.query)
# init consumer
self.consumer = ConsumerWorker(
SampleConsumer, consumer_option=option1)

# start consumer
print("*** start to consume data...")
self.consumer.start()
except Exception as e:
import traceback
traceback.print_exc()
raise e


プレフィルタリング効果テストの例

queryパラメータを設定することで、ログがサーバーからローカルに転送される前にフィルタリングを完了し、帯域幅の消費を大幅に節約できます。
元のログ
{"cdb_message":"password:99743036","log_level":"ERROR","status":"400","__SOURCE__":"127.0.0.1"}
{"cdb_message":"pwd:3qJ0VaPn","log_level":"INFO","status":"500","__SOURCE__":"127.0.0.1"}

事前フィルタリング条件(Query)
log_keep(op_and(op_gt(v("status"), 400), str_exist(v("cdb_message"), "pwd")))
最終的に消費された結果
条件を満たす2番目のログのみがローカルにダウンロードされ、process処理が行われます。

{"cdb_message":"pwd:3qJ0VaPn","log_level":"INFO","status":"500","__SOURCE__":"127.0.0.1"}



ヘルプとサポート

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

フィードバック