ダウンロード

GitHub:

https://github.com/aliyun/aliyun-log-python-sdk

手順

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 を作成します。

  1. Log Service コンソールにログインします。
  2. 右上のプロジェクトの作成をクリックします。
  3. プロジェクト名を入力して リージョンを選択し、 確認をクリックします。
  4. プロジェクトリストページより、プロジェクト名、作成、の順にクリックし、 Logstore を作成します。

    なお、Logstore はプロジェクトを作成後に、作成をクリックしても作成できます。

  5. 設定を完了し、確認をクリックします。

    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 のインストール方法は、以下のとおりです。

  1. 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 以降を推奨します。
  2. 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()