日志服务使用Java SDK快速入门指南-阿里云开发者社区

开发者社区> 开发与运维> 正文

日志服务使用Java SDK快速入门指南

简介:

为快速开始使用Log Service Java SDK,请按照如下步骤进行:

创建阿里云账号

为了访问阿里云日志服务,你需要有一个阿里云账号。如果没有,可首先如下创建阿里云账号:

  1. 访问阿里云官方网站,点击页面上“注册”按钮。
  2. 按照屏幕提示完成注册流程并进行实名认证。

为了更好地使用阿里云服务,建议尽快完成实名认证,否则部分阿里云服务将无法使用。具体实名认证流程请参考这里

获取阿里云访问秘钥

为了使用Log SDK,你必须申请阿里云的访问秘钥

  1. 登陆阿里云管理控制台
  2. 访问阿里云秘钥管理页面
  3. 选择一对用于SDK的访问秘钥对(如果没有请创建一对新访问秘钥),且保证它处于“启用”状态。

该秘钥对会在下面的步骤使用,且需要保管好,不能对外泄露。另外,你可以参考SDK配置了解更多SDK如何使用访问秘钥的信息。

创建一个日志服务项目(Project)和日志库(LogStore)

目前,Log SDK还无法管理日志项目(Project)和日志库(LogStore),所以用户需要在控制台上创建好日志库后才能使用SDK进行操作:

  1. 登陆阿里云管理控制台
  2. 点击Log服务,进入Project管理界面。
  3. 点击“创建Project”按钮,弹出创建项目对话框。
  4. 按照屏幕提示填写Project名称、注释和所属区域并确认创建Project。创建成功后即可在“Project管理页面”看到该Project。
  5. 点击新创建的项目对应的“管理”操作。进入该项目的管理页面,选择“Logstore管理”标签页。
  6. 点击“创建LogStore”按钮,弹出创建日志库对话框。
  7. 按照屏幕提示填写Logstore名称,日志消费模式等,确认创建日志库。创建成功和即可在“Logstore管理”标签页上看到刚才创建的日志库。
  1. 请确保使用同一阿里云账号获取阿里云访问秘钥和创建日志项目及日志库
  2. 关于日志的项目、日志库等概念请参考Log核心概念
  3. Log的Project名称为日志服务全局唯一,而Logstore名称在一个Project下面唯一。
  4. Log的Project一旦创建则无法更改它的所属区域。目前也不支持在不同阿里云Region间迁移Log Project。

安装Java开发环境

目前,Log Java SDK支持J2SE 6.0及以上的Java运行环境,你可以从Java官方网站下载并按说明安装Java开发环境。

安装Log Service Java SDK

在安装完Java开发环境后,你需要安装Log Service Java SDK。目前,我们提供两种方式安装日志服务的Java SDK:

  • 如果你在使用Apache Maven,你可以添加如下配置到你的Maven项目。
<dependency>
  <groupId>com.aliyun.openservices</groupId>
  <artifactId>aliyun-log</artifactId>
  <version>0.6.0</version>
</dependency>
  • 你也可以完整下载Java SDK软件包,然后在自己的Java项目中直接引用本地软件包

    1. 这里下载最新的Java SDK包。
    2. 解压完整下载的包到指定的目录即可。Java SDK是一个软件开发包,不需要额外的安装操作。
    3. 把SDK包中的所有Jar包(包括依赖的第三方包)添加到你Java工程(具体操作请参照不同的IDE文档)

开始一个新的Java项目

现在,你可以开始使用SDK Java SDK。使用任何文本编辑器或者Java IDE,运行如下示例代码即可与Log Service服务端交互并得到相应输出。

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.LogContent;
import com.aliyun.openservices.log.common.LogGroupData;
import com.aliyun.openservices.log.common.LogItem;
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>"; // 选择与上面步骤创建Project所属区域匹配的
                                                    // Endpoint
        String accessKeyId = "<your_access_key_id>"; // 使用你的阿里云访问秘钥AccessKeyId
        String accessKeySecret = "<your_access_key_secret>"; // 使用你的阿里云访问秘钥AccessKeySecret
        String project = "<project_name>"; // 上面步骤创建的项目名称
        String logstore = "<logstore_name>"; // 上面步骤创建的日志库名称
        

        // 构建一个客户端实例
        Client client = new Client(endpoint, accessKeyId, accessKeySecret);

        // 列出当前Project下的所有日志库名称
        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(i * 10 + j));
                logGroup.add(logItem);
            }
            PutLogsRequest req2 = new PutLogsRequest(project, logstore, topic,
                    source, logGroup);
            client.PutLogs(req2);
        }

        // 把0号shard中,最近1分钟写入的数据都读取出来。
        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; // 每次读取两个loggroup
            BatchGetLogResponse logDataRes = client.BatchGetLog(project,
                    logstore, shard_id, loggroup_count, curCursor);

            List<LogGroupData> logGroups = logDataRes.GetLogGroups();
            for (LogGroupData logGroup : logGroups) {
                System.out.println("Source:" + logGroup.GetSource());
                System.out.println("Topic:" + logGroup.GetTopic());
                for (LogItem log : logGroup.GetAllLogs()) {
                    System.out.println("LogTime:" + log.GetTime());
                    List<LogContent> contents = log.GetLogContents();
                    for (LogContent content : contents) {
                        System.out.println(content.GetKey() + ":"
                                + content.GetValue());
                    }
                }
            }
            String next_cursor = logDataRes.GetNextCursor();
            System.out.println("The Next cursor:" + next_cursor);
            curCursor = next_cursor;
        }

        // !!!重要提示 : 只有打开索引功能,才能调用一下接口 !!!
        
        // 等待1分钟让日志可查询
        try {
            Thread.sleep(60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 查询日志分布情况
        String query = "index";
        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()返回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;
        while (log_offset <= total_log_lines) {
            GetLogsResponse res4 = null;
            // 对于每个log offset,一次读取10行log,如果读取失败,最多重复读取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;
        }

    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章