Simple Log Service (SLS) SDK を使用すると、プログラムでログをアップロードできます。このクイックスタートでは、Python SDK を使用してログをアップロードし、コンソールでデータを可視化し、異常に対するアラートを設定する方法を説明します。
前提条件
-
利用可能な Elastic Compute Service (ECS) インスタンスがあること。詳細については、「ECS クイックスタート」をご参照ください。
-
Simple Log Service を有効化していること。詳細については、「Simple Log Service の有効化」をご参照ください。
-
Python および PyCharm などの Python 開発環境がインストールされていること。
SLS SDK for Python は、次のバージョンをサポートしています。
-
Python 2: 2.7 以降
-
Python 3: 3.7 以降
-
PyPy 2: 2.7 以降
-
PyPy 3: 3.7 以降
-
ソリューション概要
このクイックスタートでは、次のことを学びます。
-
プロジェクト (リソース管理ユニット) と Logstore (ログストレージユニット) を作成します。
-
Python SDK を使用して Logstore にログをアップロードし、インデックスを作成してから、ログのクエリと分析を行います。
-
分析結果をダッシュボード上のチャートとして可視化します。
-
モニタリングのためのアラートルールを設定します。
-
不要なリソースをクリーンアップして、課金を回避します。
1. プロジェクトと Logstore の作成
1.1 プロジェクトの作成
Simple Log Service コンソールにログインします。「プロジェクト」セクションで、プロジェクトの作成 をクリックします。プロジェクトの作成 パネルで、リージョン を選択し、プロジェクト名 を入力します。このドキュメントでは、China (Hangzhou) リージョンにある aliyun-test-project という名前のプロジェクトを例として使用します。その他のパラメーターはデフォルト値のままにします。
1.2 Logstore の作成
2. SDK のインストール
-
コマンドラインインターフェイス (CLI) で、管理者として次のコマンドを実行して Python SDK をインストールします。バージョンの詳細については、「Aliyun Log Python Release」をご参照ください。
pip install -U aliyun-log-python-sdk -
SDK がインストールされた後、次のコマンドを実行してインストールを検証します。
pip show aliyun-log-python-sdk次の出力は、SDK がインストールされたことを示します。
Name: aliyun-log-python-sdk Version: 0.9.12 Summary: Aliyun log service Python client SDK Home-page: https://github.com/aliyun/aliyun-log-python-sdk Author: Aliyun
3. クライアントの初期化
`LogClient` は SLS のクライアントです。プロジェクトや Logstore の作成、ログの書き込みと読み取りを行うメソッドを提供します。AccessKey ペア (V1 署名) を使用してクライアントを初期化するには、次の手順に従います。
-
AccessKey ペアを取得します。Alibaba Cloud コンソールで、AccessKey を作成し、
access_key_idとaccess_key_secretを取得します。 -
ご使用のオペレーティングシステム (Linux、macOS、または Windows) に基づいて、
ALIBABA_CLOUD_ACCESS_KEY_IDやALIBABA_CLOUD_ACCESS_KEY_SECRETなどのキーを 環境変数として設定します。 -
エンドポイントを設定します。このドキュメントでは、中国 (杭州) リージョンを例として、
endpointをcn-hangzhou.log.aliyuncs.comに設定します。他のリージョンの場合は、値を対応するエンドポイントに置き換えます。
# SLS パッケージをインポートします。
from aliyun.log import *
# このモジュールをインポートして、環境変数から AccessKey ペアを取得します。
import os
# 環境変数から AccessKey ID と AccessKey Secret を取得します。
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key_secret = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
# Simple Log Service のエンドポイント。
endpoint = "cn-hangzhou.log.aliyuncs.com"
# LogClient インスタンスを作成します。
client = LogClient(endpoint, access_key_id, access_key_secret)
4. ログのアップロード
この例では、put_logs API オペレーションを呼び出してログデータをアップロードします。以下は生ログの例です。
10.0.*.1 - - [14/Jul/2025:12:00:03 +0000] "POST /login HTTP/1.1" 302 0 "http://example.com/login.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"
put_logs API オペレーションを使用する際、ログのコンテンツをフィールドごとに構造化すると、その後の分析が容易になります。
# プロジェクトの名前。
project_name = "aliyun-test-project"
# Logstore の名前。
logstore_name = "aliyun-test-logstore"
# Logstore にデータを書き込みます。
def put_logs():
print("ready to put logs for %s" % logstore_name)
log_group = []
for i in range(0, 100):
log_item = LogItem()
# フィールドごとにログコンテンツを設定します。
contents = [
('remote_addr', '192.168.0.%d' % (i % 255)),
('remote_user', 'user%d' % i),
('time_local', time.strftime('%d/%b/%Y:%H:%M:%S +0000', time.gmtime())),
('request_method', 'GET' if i % 2 == 0 else 'POST'),
('request_uri', '/index.html' if i % 3 == 0 else '/api/data'),
('status', str(200 + (i % 100))), # ステータスコードは 200 から 299 の間です。
('body_bytes_sent', str(1024 + i)),
('http_referer', 'http://example.com/page%d' % (i // 10)),
('http_user_agent',
'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.%d Safari/537.36' % (i * 10))
]
log_item.set_contents(contents)
log_group.append(log_item)
request = PutLogsRequest(project_name, logstore_name, "", "", log_group, compress=False)
client.put_logs(request)
print("put logs for %s success " % logstore_name)
time.sleep(60)
5. インデックスの作成
アップロードされたログをクエリする前に、インデックスを設定する必要があります。remote_addr、remote_user、time_local、request_method、request_uri、status、body_bytes_sent、http_referer、および http_user_agent をインデックスフィールドとして設定します。
# プロジェクトの名前。
project_name = "aliyun-test-project"
# Logstore の名前。
logstore_name = "aliyun-test-logstore"
# インデックス。
logstore_index = {'line': {
'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t',
'\r'], 'caseSensitive': False, 'chn': False},
'keys': {'remote_addr': {'type': 'text', 'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t', '\r'], 'caseSensitive': False, 'alias': 'remote_addr', 'doc_value': True, 'chn': False},
'remote_user': {'type': 'text', 'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t', '\r'], 'caseSensitive': False, 'alias': 'remote_user', 'doc_value': True, 'chn': False},
'time_local': {'type': 'text', 'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t', '\r'], 'caseSensitive': False, 'alias': 'time_local', 'doc_value': True, 'chn': False},
'request_method': {'type': 'text', 'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t', '\r'], 'caseSensitive': False, 'alias': 'request_method', 'doc_value': True, 'chn': False},
'request_uri': {'type': 'text', 'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t', '\r'], 'caseSensitive': False, 'alias': 'request_uri', 'doc_value': True, 'chn': False},
'status': {'type': 'long', 'alias': 'status', 'doc_value': True},
'body_bytes_sent': {'type': 'long', 'alias': 'body_bytes_sent', 'doc_value': True},
'http_referer': {'type': 'text', 'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t', '\r'], 'caseSensitive': False, 'alias': 'http_referer', 'doc_value': True, 'chn': False},
'http_user_agent': {'type': 'text', 'token': [',', ' ', "'", '"', ';', '=', '(', ')', '[', ']', '{', '}', '?', '@', '&', '<', '>', '/', ':', '\n', '\t', '\r'], 'caseSensitive': False, 'alias': 'http_user_agent', 'doc_value': True, 'chn': False}}}
# インデックスを作成します。
def create_index():
print("ready to create index for %s" % logstore_name)
index_config = IndexConfig()
index_config.from_json(logstore_index)
client.create_index(project_name, logstore_name, index_config)
print("create index for %s success " % logstore_name)
time.sleep(60 * 2)
インデックスが作成されると、ログをクエリできます。
SLS コンソールの [生ログ] ページでは、合計 100 件のログが返されます。ログの詳細には、`body_bytes_sent:1024`、`remote_addr:192.168.0.1`、`request_method:GET`、`request_uri:/index.html`、`status:200`、`http_referer:http://example.com/page0` などのインデックスフィールドとその値が含まれます。これは、インデックスが作成され、ログデータが正常に書き込まれ、クエリ可能であることを示します。
6. ログのクエリと分析
手動でログをアップロードして、新しいログが生成されるようにします。クエリと分析の文 *| select request_method,status from aliyun-test-logstore を設定して、ログを取得します。クエリと分析機能の詳細については、「インデックスベースのクエリと分析」をご参照ください。
# プロジェクトの名前。
project_name = "aliyun-test-project"
# Logstore の名前。
logstore_name = "aliyun-test-logstore"
# クエリ文。
query = "*| select request_method,status from " + logstore_name
# from_time と to_time は、クエリの時間範囲を UNIX タイムスタンプ形式で指定します。
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
# SQL を使用してログをクエリします。
def get_logs():
print("ready to query logs from logstore %s" % logstore_name)
request = GetLogsRequest(project_name, logstore_name, from_time, to_time, query=query)
response = client.get_logs(request)
for log in response.get_logs():
for k, v in log.contents.items():
print("%s : %s" % (k, v))
print("*********************")
次の応答が返されます。
ready to query logs from logstore aliyun-test-logstore
request_method : GET
status : 200
*********************
request_method : POST
status : 201
*********************
request_method : GET
status : 202
*********************
request_method : POST
status : 203
*********************
Process finished with exit code 0
7. データの可視化
-
チャート編集ページで、解析検索 パネルのドロップダウンリストから Logstore (SQL) を選択します。次に、対応する Logstore を選択し、
* | SELECT request_method,status,COUNT(*) AS request_count GROUP BY request_method,status ORDER BY request_count DESC LIMIT 10;を入力します。このクエリは、メソッドと状態コードごとに上位 10 件のリクエスト数を計算します。この例ではフィールドをカウントするため、右側のチャートタイプから テーブル Pro を選択し、次に 適用 をクリックして結果を表示します。可視化が要件を満たしている場合は、OK をクリックし、次にダッシュボードページの右上隅にある 保存 をクリックします。ダッシュボードは、さまざまなチャートタイプ、データフィルタリング、およびサードパーティツールとの統合をサポートしています。詳細については、「可視化の概要」をご参照ください。
8. アラートとモニタリング
8.1 アクションポリシーの作成
-
左側のナビゲーションウィンドウで、アラート > を選択して、作成 をクリックします。
-
[アクションポリシーの追加] ダイアログボックスで、[Identifier] を
test-action-policyに、名前 をNew Alert Rule-My Action Policy testに設定したアクションポリシーを作成します。このポリシーは、アラートがトリガーされると DingTalk を使用して通知を送信します。アクショングループの具体的な構成は次のとおりです。-
チャネル :
DingTalk-カスタムを選択します。 -
リクエスト URL : DingTalk チャットボットの Webhook (例:
https://oapi.dingtalk.com/robot/send?access_token=4dff******6bfe) を入力します。 -
リマインダー :
リマインダーなしを選択して、DingTalk アラート通知でのメンションを防ぎます。 -
コンテンツテンプレート :
SLS 組み込みコンテンツテンプレートを選択します。 -
送信期間 :
任意の時間を選択して、アラートが発生するたびにアラート通知を送信します。
-
SLS は、ユーザー、ユーザーグループ、Webhook 統合、アクションポリシー、アラートポリシー、およびコンテンツテンプレートを管理するための SDK を提供します。詳細については、「アラートリソースデータの管理」をご参照ください。
8.2 アラートルールの作成
-
左側のナビゲーションウィンドウで、アラート > アラームルール を選択し、次に アラートの作成 をクリックします。
-
[アラートを作成] ページで、データが検出されたときに 15 分ごとに DingTalk アラート通知をトリガーするルールを設定します。ルールを次のように設定します。
-
ルール名:
New Alert Rule。 -
チェック頻度:
15 分の固定間隔。 -
クエリ統計:
-
タイプ:
Logstore。 -
エリア:
中国 (杭州)。 -
プロジェクト:
aliyun-test-project。 -
ログストア:
aliyun-test-logstore。 -
照会:
* | select *。 -
検索期間:
今日。
-
-
グループ評価:
グループ化なし。 -
トリガー条件:
データがある場合、重要度が中のアラートがトリガーされます。 -
ラベルを追加する: キーを
titleとdescに設定し、両方の値を${alert_name} alert is triggeredに設定します。 -
ターゲット Logstore: SLS 通知の場合、アクションポリシーを作成済みの
test-action-policyに設定します。
また、EventStore と CloudMonitor イベントセンター の送信先を有効にします。アラートポリシーについては、通常モード を選択し、繰り返し間隔を 1 分 に設定します。
-
9. リソースのクリーンアップ
課金が発生しないように、このクイックスタートで作成したリソースを削除してください。Logstore が存在している限り、使用されていなくてもアクティブシャードに対して課金されます。次のコードを実行して、プロジェクトとそれに関連するすべてのリソースを削除します。
# プロジェクトの名前。
project_name = "aliyun-test-project"
# 指定されたプロジェクトを削除します。
def main():
try:
response = client.delete_project(project_name)
response.log_print()
except Exception as error:
print(error)
完全なサンプルコード
関連トピック
-
SLS は、複数の言語の SDK を使用したログ収集をサポートしています。詳細については、「SDK リファレンスの概要」をご参照ください。
-
OpenAPI Explorer を使用すると、リクエストを手動でカプセル化したり、署名を処理したりすることなく、SLS API オペレーションを迅速にデバッグできます。詳細については、「OpenAPI Explorer」をご参照ください。
-
自動設定のために、SLS はコマンドラインインターフェイス (CLI) を提供しています。詳細については、「CLI の概要」をご参照ください。
-
SDK、OpenAPI Explorer、または CLI を使用すると、コンソールを使用する場合と同じ料金が発生します。詳細については、「課金概要」をご参照ください。
よくある質問
Simple Log Service SDK はどのような機能をサポートしていますか?
SLS SDK は、ログ収集、インデックス作成、クエリと分析、データ変換、ログ消費、ログ配信管理、アラート機能、スケジュール化された SQL ジョブなど、ほとんどの SLS 機能をサポートしています。機能がサポートされていない場合は、最新の SDK バージョンにアップグレードするか、今後のリリースでの更新を確認してください。
Simple Log Service SDK を使用するための基本的な手順は何ですか?
SDK の使用は、コンソールの使用と似たワークフローに従います。
-
Simple Log Service を有効化します。
-
AccessKey ペアを取得します。
-
プロジェクトと Logstore を作成します。
-
ログを収集し、Logstore に保存します。
-
ログのインデックスを作成します。
-
ログのクエリと分析を行い、結果を可視化します。
-
データ変換、配信、アラート機能など、ログデータに対する操作を実行します。
より簡単な操作については、SLS コンソールを使用してください。「クイックスタート」をご参照ください。
SDK のデバッグ時に一般的なエラーを処理するにはどうすればよいですか?
SLS SDK には、組み込みのエラー処理が備わっています。例外は次のカテゴリに分類されます。
-
SLS によって返される例外。SDK はこれらの例外を処理します。詳細については、API オペレーションの説明と「エラーコード」をご参照ください。
-
ネットワーク切断やサーバー応答タイムアウトなど、SDK がリクエストを送信する際に発生するネットワーク例外。
-
メモリオーバーフローなど、SDK によって生成されるプラットフォームおよび言語固有の例外。
「エラー処理」をご参照ください。
ログ収集、インデックス作成、クエリと分析、および変換に関連する一般的なエラーの解決策については、「よくある質問」をご参照ください。
Simple Log Service SDK の使用に制限はありますか?
SLS は、プロジェクト、Logstore、シャード、および LogItem のサイズに制限を課しています。SDK を使用する前に、「基本リソースの制限事項」を確認してください。
SDK を使用するためのコード例のドキュメントはありますか?
SLS は、一般的な操作のコード例を提供しています。各 SDK のリファレンスドキュメントをご参照ください。
-
Simple Log Service SDK for Java:
-
Simple Log Service SDK for Python:
-
さまざまな言語向けの Simple Log Service SDK:
その他のソースコードについては、GitHub の Alibaba Cloud ログリポジトリをご参照ください。