ダウンロード
GitHub:
手順
Log Service Python SDK をすぐに使いはじめるための手順は、以下のとおりです。
ステップ 1 Alibaba Cloud アカウントを作成
Alibaba Cloud アカウントの作成方法については、「アカウント登録手順」をご参照ください。
ステップ 2 Alibaba Cloud AccessKey を取得
Log Service Python SDK を使用する前に、AccessKey を準備しておきます。
Alibaba Cloud アカウントで、AccessKey 管理ページにログインし、 SDK 用の AccessKey を選択します。AccessKey をまだ作成していない場合は作成し、有効になっていることを確認します。 AccessKey の作成方法については、「準備」をご参照ください。
AccessKey は以下のステップで使用します。厳重に保管します。 SDK で AccessKey を使用する方法については、「 設定 」をご参照ください。
ステップ 3 Log Service プロジェクトおよび Logstore を作成
Log Service PHP SDK を使用する前に、コンソールより Log Service プロジェクトおよび Logstore を作成します。
- Log Service コンソールにログインします。
- 右上のプロジェクトの作成をクリックします。
- プロジェクト名を入力して リージョンを選択し、 確認をクリックします。
- プロジェクトリストページより、プロジェクト名、作成、の順にクリックし、 Logstore を作成します。
なお、Logstore はプロジェクトを作成後に、作成をクリックしても作成できます。
- 設定を完了し、確認をクリックします。
Logstore 名およびデータの保管期間を入力します。また、シャード数を選択します。 必要なシャード数をご選択ください。 例では、シャードを 4 つ指定しています。
- AccessKey、プロジェクトおよび Logstore は、同一の Alibaba Cloud アカウントで作成している必要があります。
- Log Service プロジェクトおよび Logstore の詳細については、Log Service の「概要」をご参照ください。
- プロジェクト名は Log Service 内で一意にします。また、Logstore 名はプロジェクト内で一意にします。
- プロジェクトの作成後に、リージョンを変更することはできません。また、別のリージョンにプロジェクトを移行することもできません。
ステップ 4 Python 環境をインストール
Python SDK は純粋な Python ライブラリであり、Python を実行できるすべてのオペレーティングシステム (Linux、Mac OS X、 Windows など) に対応しています。 Python のインストール方法は、以下のとおりです。
- Python の最新インストールパッケージをダウンロードし、インストールします。
注
- Python SDK は Python 2.6/2.7 および Python 3.3/3.4/3.5/3.6 環境に対応しています。
python -V
コマンドを実行して、実行中の Python のバージョンを確認します。 - Python 2.6 および Python 3.3 の正式サポートは終了しています。 Python 2.7 以降、または、 Python 3.4 以降を推奨します。
- Python SDK は Python 2.6/2.7 および Python 3.3/3.4/3.5/3.6 環境に対応しています。
- Python パッケージの管理ツール pip をダウンロードし、インストールします。
pip をインストール後、
pip -V
を実行して pip が正常にインストールされていること、また、バージョンを確認します。
ステップ 5 Python SDK をインストール
管理者権限で以下のシェルコマンドを実行し、Python SDK をインストールします。
pip install -U aliyun-log-python-sdk
ステップ 6 Python プログラムを実行
以上で Python SDK を使用する環境は整いました。 Log Service にアクセスして処理を実行するには、以下のサンプルコードをテキストエディタまたは Python IDE で編集し、実行します。
詳細については、Github/readthedocs をご参照ください。
# エンコード形式: utf-8
import time
from aliyun.log.logitem import LogItem
from aliyun.log.logclient import LogClient
from aliyun.log.getlogsrequest import GetLogsRequest
from aliyun.log.putlogsrequest import PutLogsRequest
from aliyun.log.listlogstoresrequest import ListLogstoresRequest
from aliyun.log.gethistogramsrequest import GetHistogramsRequest
def main():
endpoint = '' # 上記のステップで作成したプロジェクトの属しているリージョンのエンドポイントを指定
accessKeyId = '' # Alibaba Cloud AccessKey ID を指定
accessKey = '' # Alibaba Cloud AccessKey Secret を指定
project = '' # 上記のステップで作成したプロジェクトの名前を指定
logstore = '' # 上記のステップで作成した Logstore の名前を指定
# 注: 後でのテストに、作成した Logstore にシャードを 4 つ指定
# クライアントを作成
client = LogClient(endpoint, accessKeyId, accessKey)
# Logstore をすべて列挙
req1 = ListLogstoresRequest(project)
res1 = client.list_logstores(req1)
res1.log_print()
topic = ""
source = ""
# データパケットを 10 個送信 (1 パケットにつき、ログ 10 件)
for i in range(10):
logitemList = [] # ログ項目のリスト
for j in range(10):
contents = [('index', str(i * 10 + j))]
logItem = LogItem()
logItem.set_time(int(time.time()))
logItem.set_contents(contents)
logitemList.append(logItem)
req2 = PutLogsRequest(project, logstore, topic, source, logitemList)
res2 = client.put_logs(req2)
res2.log_print()
# シャードをすべて列挙し、1 分以内に書き込まれたデータを読み取る
listShardRes = client.list_shards(project, logstore)
for shard in listShardRes.get_shards_info():
shard_id = shard["shardID"]
start_time = int(time.time() - 60)
end_time = start_time + 60
res = client.get_cursor(project, logstore, shard_id, start_time)
res.log_print()
start_cursor = res.get_cursor()
res = client.get_cursor(project, logstore, shard_id, end_time)
end_cursor = res.get_cursor()
while True:
loggroup_count = 100 # 1 度に 100 パケットを読み込む
res = client.pull_logs(project, logstore, shard_id, start_cursor, loggroup_count, end_cursor)
res.log_print()
next_cursor = res.get_next_cursor()
if next_cursor == start_cursor:
break
start_cursor = next_cursor
# 注: インデックス機能が有効な場合にのみ、以下の関数でデータをクエリすることが可能
time.sleep(60)
topic = ""
query = "index"
From = int(time.time()) - 600
To = int(time.time())
res3 = None
# 10 分以内のログでクエリ条件に一致するログの数を取得 (実行結果が正しくない場合は、再試行)
while (res3 is None) or (not res3.is_completed()):
req3 = GetHistogramsRequest(project, logstore, From, To, topic, query)
res3 = client.get_histograms(req3)
res3.log_print()
# クエリ条件に一致するログの数を取得
total_log_count = res3.get_total_count()
log_line = 10
# ログを 10 件読み込むたびに、ログデータをクエリ (各クエリの結果が正しくない場合、3 回まで再試行)
for offset in range(0, total_log_count, log_line):
res4 = None
for retry_time in range(0, 3):
req4 = GetLogsRequest(project, logstore, From, To, topic, query, log_line, offset, False)
res4 = client.get_logs(req4)
if res4 is not None and res4.is_completed():
break
time.sleep(1)
if res4 is not None:
res4.log_print()
listShardRes = client.list_shards(project, logstore)
shard = listShardRes.get_shards_info()[0]
# シャードを分割
if shard["status"] == "readwrite":
shard_id = shard["shardID"]
inclusiveBeginKey = shard["inclusiveBeginKey"]
midKey = inclusiveBeginKey[:-1] + str((int(inclusiveBeginKey[-1:])) + 1)
client.split_shard(project, logstore, shard_id, midKey)
# シャードを統合
shard = listShardRes.get_shards_info()[1]
if shard["status"] == "readwrite":
shard_id = shard["shardID"]
client.merge_shard(project, logstore, shard_id)
# シャードを削除
shard = listShardRes.get_shards_info()[-1]
if shard["status"] == "readonly":
shard_id = shard["shardID"]
client.delete_shard(project, logstore, shard_id)
# 外部ストレージを作成
res = client.create_external_store(project,ExternalStoreConfig("rds_store","cn-qingdao","rds-vpc","vpc-************","i***********","*. *. *.*","3306","root","sfdsfldsfksflsdfs","meta","join_meta"));
res.log_print()
res = client.update_external_store(project,ExternalStoreConfig("rds_store","cn-qingdao","rds-vp","rds-vpc","vpc-************","i************","*. *. *.*","3306","root","sfdsfldsfksflsdfs","meta","join_meta"));
res.log_print()
res = client.get_external_store(project,"rds_store");
res.log_print()
res = client.list_external_store(project,"");
res.log_print();
res = client.delete_external_store(project,"rds_store")
res.log_print();
# Python SDK を使用したクエリ分析
req4 = GetLogsRequest(project, logstore, From, To, topic, "* | select count(1)", 10,0, False)
res4 = client.get_logs(req4)
# Python SDK を使用した RDS クエリを結合
req4 = GetLogsRequest(project, logstore, From, To, topic, "* | select count(1) from "+logstore +" l join rds_store r on l.ikey =r.ekey", 10,0, False)
res4 = client.get_logs(req4)
# Python SDK を使用した RDS へのクエリ結果の追加
req4 = GetLogsRequest(project, logstore, From, To, topic, "* | insert into rds_store select count(1) ", 10,0, False)
res4 = client.get_logs(req4)
if __name__ == '__main__':
main()