All Products
Search
Document Center

Simple Log Service:Consume log data by using Simple Log Service SDK

Last Updated:Nov 05, 2024

Simple Log Service SDK supports multiple programming languages. You can use the SDK to consume log data. This topic describes how to use Simple Log Service SDK to consume log data.

Prerequisites

Background information

You can call the PullLogs operation to query log data based on the specified cursors. For more information, see PullLogs. Applications that are developed by using programming languages such as Java, Python, and Go can consume data that is collected by Simple Log Service as consumers or consumer groups.

Simple Log Service supports Simple Log Service Processing Language (SPL) in the following scenarios: real-time consumption, scan-based query, and Logtail collection. For more information, see SPL overview.

Procedure

Before you use Simple Log Service SDK for Java, make sure that the SDK is installed. For more information, see Install Simple Log Service SDK for Java.

Use the SDK

The following example shows how to call the PullLogs operation of Simple Log Service SDK to obtain log data for consumption. For more information, see PullLogs.

Parameters

Parameter

Type

Required

Description

project

string

Yes

The name of the Simple Log Service project. For more information, see Manage a project.

logStore

string

Yes

The name of the Simple Log Service Logstore. A Simple Log Service Logstore is used to collect, store, and query logs. For more information, see Manage a Logstore.

shardId

int

Yes

The ID of the shard in the Logstore. For more information, see Shard.

Add Maven dependencies

Open the pom.xml file in the root directory of your Java project and add the following code:

<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.99</version>
</dependency>

Create a file named PullLogsDemo.java

Sample code:

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.Consts;
import com.aliyun.openservices.log.common.LogGroupData;
import com.aliyun.openservices.log.common.Shard;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PullLogsRequest;
import com.aliyun.openservices.log.response.ListShardResponse;
import com.aliyun.openservices.log.response.PullLogsResponse;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PullLogsDemo {
    // The Simple Log Service endpoint. In this example, the Simple Log Service endpoint for the China (Hangzhou) region is used. Replace the parameter value with the actual endpoint.
    private static final String endpoint = "cn-hangzhou.log.aliyuncs.com";
    // In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 
    private static final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    private static final String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
    // The name of the project.
    private static final String project = "your_project";
    // The name of the Logstore.
    private static final String logStore = "your_logstore";

    public static void main(String[] args) throws Exception {
        // Create a client for Simple Log Service.
        Client client = new Client(endpoint, accessKeyId, accessKeySecret);
        // Query the shards of the Logstore.
        ListShardResponse resp = client.ListShard(project, logStore);
        System.out.printf("%s has %d shards\n", logStore, resp.GetShards().size());
        Map<Integer, String> cursorMap = new HashMap<Integer, String>();
        for (Shard shard : resp.GetShards()) {
            int shardId = shard.getShardId();
            // Use the BEGIN cursor or obtain a specific cursor to consume log data. If you want to use the END cursor to consume log data, use Consts.CursorMode.END.
            cursorMap.put(shardId, client.GetCursor(project, logStore, shardId, Consts.CursorMode.BEGIN).GetCursor());
        }
        try {
            while (true) {
                // Obtain logs from each shard.
                for (Shard shard : resp.GetShards()) {
                    int shardId = shard.getShardId();
                    PullLogsRequest request = new PullLogsRequest(project, logStore, shardId, 1000, cursorMap.get(shardId));
                    PullLogsResponse response = client.pullLogs(request);
                    // Obtain logs from log groups by logic. Logs are usually stored in log groups. 
                    List<LogGroupData> logGroups = response.getLogGroups();
                    System.out.printf("Get %d logGroup from logStore:%s:\tShard:%d\n", logGroups.size(), logStore, shardId);
                    // Move the cursor after the obtained logs are processed. 
                    cursorMap.put(shardId, response.getNextCursor());
                }
            }
        } catch (LogException e) {
            System.out.println("error code :" + e.GetErrorCode());
            System.out.println("error message :" + e.GetErrorMessage());
            throw e;
        }
    }
}

Use the SDK and SPL

The following example shows how to call the PullLogs operation of Simple Log Service SDK to obtain log data for SPL-based consumption. For more information, see PullLogs.

Parameters

Parameter

Type

Required

Description

project

string

Yes

The name of the Simple Log Service project. For more information, see Manage a project.

logStore

string

Yes

The name of the Simple Log Service Logstore. A Simple Log Service Logstore is used to collect, store, and query logs. For more information, see Manage a Logstore.

shardId

int

Yes

The ID of the shard in the Logstore. For more information, see Shard.

Add Maven dependencies

Open the pom.xml file in the root directory of your Java project and add the following code:

<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.99</version>
</dependency>

Create a file named PullLogsWithSPLDemo.java

Sample code:

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.*;
import com.aliyun.openservices.log.common.Consts;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PullLogsRequest;
import com.aliyun.openservices.log.response.ListShardResponse;
import com.aliyun.openservices.log.response.PullLogsResponse;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PullLogsWithSPLDemo {
    // The Simple Log Service endpoint. In this example, the Simple Log Service endpoint for the China (Hangzhou) region is used. Replace the parameter value with the actual endpoint.
    private static final String endpoint = "cn-hangzhou.log.aliyuncs.com";
    // In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 
    private static final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    private static final String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
    // The name of the project.
    private static final String project = "your_project";
    // The name of the Logstore.
    private static final String logStore = "your_logstore";

    public static void main(String[] args) throws Exception {
        // Create a client for Simple Log Service.
        Client client = new Client(endpoint, accessKeyId, accessKeySecret);
        // Query the shards of the Logstore.
        ListShardResponse resp = client.ListShard(project, logStore);
        System.out.printf("%s has %d shards\n", logStore, resp.GetShards().size());
        Map<Integer, String> cursorMap = new HashMap<Integer, String>();
        for (Shard shard : resp.GetShards()) {
            int shardId = shard.getShardId();
            // Use the BEGIN cursor or obtain a specific cursor to consume log data. If you want to use the END cursor to consume log data, use Consts.CursorMode.END.
            cursorMap.put(shardId, client.GetCursor(project, logStore, shardId, Consts.CursorMode.BEGIN).GetCursor());
        }
        try {
            while (true) {
                // Obtain logs from each shard.
                for (Shard shard : resp.GetShards()) {
                    int shardId = shard.getShardId();
                    PullLogsRequest request = new PullLogsRequest(project, logStore, shardId, 1000, cursorMap.get(shardId));
                    request.setQuery("* | where cast(body_bytes_sent as bigint) > 14000");
                    request.setPullMode("scan_on_stream");
                    PullLogsResponse response = client.pullLogs(request);
                    // Obtain logs from log groups by logic. Logs are usually stored in log groups. 
                    List<LogGroupData> logGroups = response.getLogGroups();
                    System.out.printf("Get %d logGroup from logStore:%s:\tShard:%d\n", logGroups.size(), logStore, shardId);

                    // Move the cursor after the obtained logs are processed. 
                    cursorMap.put(shardId, response.getNextCursor());
                }
            }
        } catch (LogException e) {
            System.out.println("error code :" + e.GetErrorCode());
            System.out.println("error message :" + e.GetErrorMessage());
            throw e;
        }
    }
}

References