ダウンロード

Java 開発者は、Log Service Java SDK を使用することにより、 Java プログラムで Log Service を簡単に操作できます。 また、直接 Maven ライブラリを使用し、SDK を追加、また、パッケージをローカルマシンにダウンロードすることができます。 Log Service Java SDK は、現時点では、J2SE 6.0 以降に対応しています。 こちらをクリックして、最新の SDK をダウンロードします。

手順

Log Service Java SDK をすぐに使いはじめる手順は、以下のとおりです。

ステップ 1 Alibaba Cloud アカウントを作成

Alibaba Cloud アカウントの作成方法については、「アカウント登録手続」をご参照ください。

ステップ 2 Alibaba Cloud AccessKey を取得

Log Service Java SDK を使用する前に、Alibaba Cloud AccessKey を準備しておきます。

Alibaba Cloud アカウントでログインし、AccessKey 管理ページより、 SDK 用の AccessKey を選択します。 AccessKey をまだ作成していない場合は作成します。また、AccessKey が有効になっていることを確認します。 AccessKey は、以下のステップで必要になります。厳重に保管してください。 AccessKey を作成し、有効にする方法については、「準備」をご参照ください。

AccessKey は、以下のステップで必要になります。 厳重に保管してください。 SDK で AccessKey を使用する方法については、「 設定 」をご参照ください。

ステップ 3 Log Service プロジェクトおよび Logstore を作成

Log Service Java SDK を使用する前に、コンソールより Log Service プロジェクトおよび Logstore を作成しておきます。

プロジェクトおよび Logstore の作成方法については、「準備」をご参照ください。

  • AccessKey、プロジェクトおよび Logstore は、同一の Alibaba Cloud アカウントで作成したものである必要があります。
  • Log Service プロジェクトおよび Logstore の詳細については、「基本概念」をご参照ください。
  • プロジェクト名は Log Service 内で一意にします。また、Logstore 名はプロジェクト内で一意にします。
  • プロジェクトの作成後に、リージョンを変更することはできません。また、別のリージョンにプロジェクトを移行することもできません。

ステップ 4 Java 開発環境をインストール

Log Service Java SDK は、現時点において、J2SE 6.0 以降の Java ランタイム環境に対応しています。 Java 公式サイトよりインストールパッケージをダウンロードし、指示に従って Java 開発環境をインストールします。

ステップ 5 Log Service Java SDK をインストール

Java 開発環境を構築できたら、Log Service Java SDK をインストールします。 Log Service Java SDK をインストールするには、次の 2 つの方法があります。

  1. Apache Maven を使用して SDK の最新バージョンを入手することをお勧めします。 Maven プロジェクトに以下の設定を追加します。
    <dependency>
             <groupId>com.google.protobuf</groupId>
             <artifactId>protobuf-java</artifactId>
             <version>2.5.0</version>
    </dependency>
    <dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>aliyun-log</artifactId>
    <version>0.6.7</version>
    <exclusions>
            <exclusion>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
           </exclusion>
    </exclusions>
    </dependency>
  2. Java SDK パッケージをダウンロードし、Java プロジェクトのローカルパッケージを直接参照させることもできます。
    1. こちらをクリックして、Java SDK パッケージをダウンロードします。 定期的にバージョンは更新されています。 最新バージョンを入手する際は、Maven を使用します。
    2. ダウンロードしたパッケージを指定のディレクトリに解凍します。 Java SDK をインストールする必要はありません。
    3. SDK パッケージ内のすべての .jar パッケージを Java プロジェクトに追加します (サードパーティーのライブラリパッケージを含む)。 詳細については、IDE ドキュメントをご参照ください。

ステップ 6 新規 Java プロジェクトを使用開始

以上で Java SDK を使用する準備が整いました。 Log Service にアクセスして必要なログを取得するには、 テキストエディタまたは Java IDE で次のサンプルコードを編集し、実行します。 Java SDK の使用方法については、本ドキュメント内に記載してあります。

package sdksample;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.Date;
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.*;
import com.aliyun.openservices.log.exception.*;
import com.aliyun.openservices.log.request.*;
import com.aliyun.openservices.log.response.*;
import com.aliyun.openservices.log.common.LogGroupData;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.common.Logs.Log;
import com.aliyun.openservices.log.common.Logs.Log.Content;
import com.aliyun.openservices.log.common.Logs.LogGroup;
import com.aliyun.openservices.log.common.Consts.CursorMode;
public class sdksample {
    public static void main(String args[]) throws LogException, InterruptedException {
        String endpoint = "<log_service_endpoint>"; // Select the endpoint that matches the region of the project created in the preceding step.
        // エンドポイント
        String accessKeyId = "<your_access_key_id>"; // Alibaba Cloud AccessKey ID を指定
        String accessKeySecret = "<your_access_key_secret>"; // Alibaba Cloud AccessKey Secret を指定
        // AccessKey Secret
        String project = "<project_name>"; // 上記のステップで作成したプロジェクトの名前
        String logstore = ""<logstore_name>"; // 上記のステップで作成した Logstore の名前
        // クライアントインスタンスを作成
        Client client = new Client(endpoint, accessKeyId, accessKeySecret);
        // プロジェクト内の Logstore 名をすべて列挙
        int offset = 0;
        int size = 100;
        String logStoreSubName = "";
        ListLogStoresRequest req1 = new ListLogStoresRequest(project, offset, size, logStoreSubName);
        ArrayList<String> logStores = client.ListLogStores(req1). GetLogStores();
        System.out.println("ListLogs:" + logStores.toString() + "\n");
        // ログを書き込む
        String topic = "";
        String source = "";
        // 続けて 10 パッケージを送信 (各パッケージにつき 10 のログ)
        for (int i = 0; i < 10; i++) {
            Vector<LogItem> logGroup = new Vector<LogItem>();
            for (int j = 0; j < 10; j++) {
                LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
                logItem.PushBack("index"+String.valueOf(j), String.valueOf(i * 10 + j));
                logGroup.add(logItem);
            }
            PutLogsRequest req2 = new PutLogsRequest(project, logstore, topic, source, logGroup);
            client.PutLogs(req2);
            /*
             * データの送信先シャードを指定 (シャードのハッシュキーを指定) 
              * HashKey を含むシャードにデータを書き込みます。 本 API の詳細については、次のインターフェイスをご参照ください。 public PutLogsResponse
             * PutLogs( String project, String logStore, String topic,
             * List <logitem> logitems, string source, string shardhash //
             * HashKey を含むシャードにデータが書き込まれます (MD5(ip) または MD5(id))。) throws
             * LogException;
             */
        }
        // 1 分以内にシャード 0 に書き込まれたデータを読み込む
        int shard_id = 0;
        long curTimeInSec = System.currentTimeMillis() / 1000;
        GetCursorResponse cursorRes = client.GetCursor(project, logstore, shard_id, curTimeInSec - 60);
        String beginCursor = cursorRes.GetCursor();
        cursorRes = client.GetCursor(project, logstore, shard_id, CursorMode.END);
        String endCursor = cursorRes.GetCursor();
        String curCursor = beginCursor;
        while (curCursor.equals(endCursor) == false) {
            int loggroup_count = 2; // 1 度にロググループを 2 つ読み込む
            BatchGetLogResponse logDataRes = client.BatchGetLog(project, logstore, shard_id, loggroup_count, curCursor,
                    endCursor);
            // ロググループのリストを読み込む
            List<LogGroupData> logGroups = logDataRes.GetLogGroups();
            for(LogGroupData logGroup: logGroups){
                FastLogGroup flg = logGroup.GetFastLogGroup();
                System.out.println(String.format("\tcategory\t:\t%s\n\tsource\t:\t%s\n\ttopic\t:\t%s\n\tmachineUUID\t:\t%s",
                        flg.getCategory(), flg.getSource(), flg.getTopic(), flg.getMachineUUID()));
                System.out.println("Tags");
                for (int tagIdx = 0; tagIdx < flg.getLogTagsCount(); ++tagIdx) {
                    FastLogTag logtag = flg.getLogTags(tagIdx);
                    System.out.println(String.format("\t%s\t:\t%s", logtag.getKey(), logtag.getValue()));
                }
                for (int lIdx = 0; lIdx < flg.getLogsCount(); ++lIdx) {
                    FastLog log = flg.getLogs(lIdx);
                    System.out.println("--------\nLog: " + lIdx + ", time: " + log.getTime() + ", GetContentCount: " + log.getContentsCount());
                    for (int cIdx = 0; cIdx < log.getContentsCount(); ++cIdx) {
                        FastLogContent content = log.getContents(cIdx);
                        System.out.println(content.getKey() + "\t:\t" + content.getValue());
                    }
                }
            }
            String next_cursor = logDataRes.GetNextCursor();
            System.out.println("The Next cursor:" + next_cursor);
            curCursor = next_cursor;
        }
        // !!! // 注: インデックス機能が有効な場合にのみ次のインターフェイスを呼び出すことができます。
        // 1 分経過後にクエリ可能になるため、1 分間待機
        try {
            Thread.sleep(60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // クエリログの送信
        String query = "<クエリキーワード (すべてのコンテンツをクエリ対象にする場合は、空の文字列を指定)>";
        int from = (int) (new Date().getTime() / 1000 - 300);
        int to = (int) (new Date().getTime() / 1000);
        GetHistogramsResponse res3 = null;
        while (true) {
            GetHistogramsRequest req3 = new GetHistogramsRequest(project, logstore, topic, query, from, to);
            res3 = client.GetHistograms(req3);
            if (res3 ! = null && res3. IsCompleted()) // IsCompleted()
            // IsCompleted() に「true」が返された場合は、正常なクエリ結果
            // 「false」が返された場合には、結果を再クエリします。
            {
                break;
            }
            Thread.sleep(200);
        }
        System.out.println("Total count of logs is " + res3. GetTotalCount());
        for (Histogram ht : res3. GetHistograms()) {
            System.out.printf("from %d, to %d, count %d.\n", ht.GetFrom(), ht.GetTo(), ht.GetCount());
        }
        // ログデータにクエリ
        long total_log_lines = res3. GetTotalCount();
        int log_offset = 0;
        int log_line = 10; // log_line に指定可能な最大値: 100 (1 回につき 100 行取得)。 さらにデータを読み込むには、オフセットを使用して次のページに移動します。 オフセットおよび行は、キーワードの場合にのみ有効であり、SQL クエリの場合は無効です。 SQL クエリ結果の読み込みは limit 句で増やします。
        while (log_offset <= total_log_lines) {
            GetLogsResponse res4 = null;
            // 各ログにつき、オフセットから 10 行のログを読み込みます。 読み込みに失敗した場合、読み込みを最大 3 回再試行します。
            for (int retry_time = 0; retry_time < 3; retry_time++) {
                GetLogsRequest req4 = new GetLogsRequest(project, logstore, from, to, topic, query, log_offset,
                        log_line, false);
                res4 = client.GetLogs(req4);
                if (res4 ! = null && res4. IsCompleted()) {
                    break;
                }
                Thread.sleep(200);
            }
            System.out.println("Read log count:" + String.valueOf(res4. GetCount()));
            log_offset += log_line;
        }
        // 分析関数を有効化 (SQL は分析関数が有効な場合にのみ実行されます。 コンソールまたは SDK より分析関数を有効にします。) // 分析関数を実行
        IndexKeys indexKeys = new IndexKeys();
        ArrayList<String> tokens = new ArrayList<String>();
        tokens.add(",");
        tokens.add(".");
        tokens.add("#");
        IndexKey keyContent = new IndexKey(tokens,false,"text");
        indexKeys.AddKey("index0",keyContent);
        keyContent = new IndexKey(new ArrayList<String>(),false,"long");
        indexKeys.AddKey("index1",keyContent);
        keyContent = new IndexKey(new ArrayList<String>(),false,"double");
        indexKeys.AddKey("index2",keyContent);
        IndexLine indexLine = new IndexLine(new ArrayList<String>(),false);
        Index index = new Index(7,indexKeys,indexLine);
        CreateIndexRequest createIndexRequest = new CreateIndexRequest(project,logstore,index);
        client.CreateIndex(createIndexRequest);
         // 分析関数を実行
        GetLogsRequest req4 = new GetLogsRequest(project, logstore, from, to, "", " index0:value | select avg(index1) as v1,sum(index2) as v2, index0 group by index0");
        GetLogsResponse res4 = client.GetLogs(req4);
        if(res4 ! = null && res4. IsCompleted()){
            for (QueriedLog log : res4. GetLogs()){
                LogItem item = log.GetLogItem();
                for(LogContent content : item.GetLogContents()){
                    System.out.print(content.GetKey()+":"+content.GetValue());
                }
                System.out.println();
            }
        }
    }
}

注意事項

  1. システムの I/O 効率を高めるには、SDK を介して Log Service にデータを書き込まないようにします。 標準のデータ書き込みについては、「Producer Library」を参照。
  2. Log Service のデータ読み込みに、直接 SDK を介したインターフェイスの実行は避けます。 高度なコンシューマーライブラリが用意されています。Log Service の実装に関する知識がなくても、負荷分散や順番に読み込むといった関数を使用できます。「コンシューマーグループ - 使用法」を参照。