日志服务使用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;
        }

    }
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
23天前
|
Java 数据处理 调度
Dataphin常见问题之离线管道同步数据datax就报连接超时如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
3月前
|
存储 Java 调度
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
|
3月前
|
Java 调度
从零开始学习 Java:简单易懂的入门指南之多线程(三十四)
从零开始学习 Java:简单易懂的入门指南之多线程(三十四)
|
3月前
|
存储 Java 数据安全/隐私保护
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
|
3月前
|
存储 移动开发 Java
从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
|
3月前
|
Java API
从零开始学习 Java:简单易懂的入门指南之File类(二十九)
从零开始学习 Java:简单易懂的入门指南之File类(二十九)
|
3月前
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
|
1月前
|
分布式计算 Oracle Java
第一篇CSDN博客——Java入门指南:学习Java编程的第一步
第一篇CSDN博客——Java入门指南:学习Java编程的第一步
|
2月前
|
IDE Java 应用服务中间件
Java Web开发入门指南:从基础到实践
Java Web开发入门指南:从基础到实践
|
2月前
|
Oracle Java 关系型数据库
滚雪球学Java(01):Java是什么?| 入门指南
【2月更文挑战第1天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
44 1
滚雪球学Java(01):Java是什么?| 入门指南

热门文章

最新文章