日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

GetContextLogs - 查詢上下文日志

調用GetContextLogs接口查詢指定日志前(上文)后(下文)的若干條日志。

接口說明

  • 上下文查詢的時間范圍為起始日志的前后一天。
  • Host 由 Project 名稱和日志服務 Endpoint 構成,您需要在 Host 中指定 Project。
  • 已創建并獲取 AccessKey。更多信息,請參見訪問密鑰

阿里云賬號 AccessKey 擁有所有 API 的訪問權限,風險很高。強烈建議您創建并使用 RAM 用戶進行 API 訪問或日常運維。RAM 用戶需具備操作日志服務資源的權限。具體操作,請參見創建 RAM 用戶及授權

  • 已明確您查詢日志所屬的 Project 名稱、所屬地域、Logstore 名稱等。如何查詢,請參見管理 Project管理 Logstore
  • 查詢日志前,已配置索引。具體操作,請參見創建索引
  • pack_id 和 pack_meta 字段屬于內部字段,在執行查詢前,您需要在日志服務控制臺通過瀏覽器的調試功能獲取字段值。

鑒權資源

下表列出了 API 對應的授權信息。您可以在 RAM 權限策略語句的 Action 元素中添加該信息,用于為 RAM 用戶或 RAM 角色授予調用此 API 的權限。

動作(Action)授權策略中的資源描述方式(Resource)
log:GetLogStoreContextLogsacs:log:{#regionId}:{#accountId}:project/{#ProjectName}/logstore/{#LogstoreName}

調試

您可以在OpenAPI Explorer中直接運行該接口,免去您計算簽名的困擾。運行成功后,OpenAPI Explorer可以自動生成SDK代碼示例。

授權信息

當前API暫無授權信息透出。

請求語法

GET /logstores/{logstore}?type=context_log HTTP/1.1

請求參數

名稱類型必填描述示例值
projectstring

Project 名稱。

ali-test-project
logstorestring

Logstore 名稱。

test-logstore
pack_idstring

起始日志所屬的 LogGroup 的唯一身份標識。

85C897C740352DC6-808
pack_metastring

起始日志在對應 LogGroup 內的唯一上下文結構標識。

2|MTY1NTcwNTUzODY5MTY0MDk1Mg==|3|0
back_lineslong

指定起始日志往前(上文)的日志條數,取值范圍為(0,100]

10
forward_lineslong

指定起始日志往后(下文)的日志條數,取值范圍為(0,100]

10

返回參數

名稱類型描述示例值
object

Schema of Response

total_lineslong

返回的總日志條數,包含請求參數中所指定的起始日志。

201
back_lineslong

向前查詢到的日志條數。

100
forward_lineslong

向后查詢到的日志條數。

100
progressstring

查詢的結果是否完整。

  • Complete:查詢已經完成,返回結果為完整結果。
  • Incomplete:查詢已經完成,返回結果為不完整結果,需要重復請求以獲得完整結果。
Complete
logsarray<object>

獲取到的日志。

object

獲取到的日志,按上下文順序排列。當根據指定起始日志查詢不到上下文日志時,此參數為空。

{ "__index_number__": "-100", "__tag__:__pack_id__": "895CEA449A52FE-8c8", "__pack_meta__": "0|MTU1OTI4NTExMjg3NTQ2NDU1OA==|4|1"}

logs 中的每一項都是該日志的內容(鍵值對),除用戶日志內容外,還包含三個字段,具體如下:

參數名稱數據類型示例值描述
__index_number__ String-100該日志在本次查詢結果中相對上下文的位置,負數表示上文,0 表示起始日志,正數表示下文。例如:-100 表示起始日志往前的第 100 條日志。
__tag__:__pack_id__String895CEA449A52FE-8c8該日志所屬的 LogGroup 的唯一身份標識,可作為請求參數中的 pack_id 進行查詢。
__pack_meta__String0|MTU1OTI4NTExMjg3NTQ2NDU1OA==|4|1該日志在所屬 LogGroup 內的唯一上下文結構標識,可作為請求參數中的 pack_meta 進行查詢。

示例

正常返回示例

JSON格式

{
  "total_lines": 201,
  "back_lines": 100,
  "forward_lines": 100,
  "progress": "Complete",
  "logs": [
    {
      "__index_number__": "-100",
      "__tag__:__pack_id__": "895CEA449A52FE-8c8",
      "__pack_meta__": "0|MTU1OTI4NTExMjg3NTQ2NDU1OA==|4|1"
    }
  ]
}

錯誤碼

訪問錯誤中心查看更多錯誤碼。

HTTP 狀態碼錯誤碼錯誤信息描述
404ProjectNotExistProject ProjectName does not exist.Project 不存在。
404LogstoreNotExistlogstore logstoreName does not exist.Logstore 不存在。
400InvalidParameterInvalid pack meta/id.請求參數中的 pack_meta 或 pack_id 為非法值。
400InvalidParameterback_lines or forward_lines must be postive.請求參數中的 back_lines 或 forward_lines 中有非法值,其中至少有一個參數應為正數。

更多錯誤碼,請參見通用錯誤碼

SDK 示例

此處以 Java SDK 為例,請使用 Java SDK 0.6.38 及以上的版本。 如果您通過 Logtail 采集方式采集日志,該方式將自動為日志附加上下文信息。 更多示例,請參見 SDK 代碼示例

package sdksample;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.LogContent;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.common.QueriedLog;
import com.aliyun.openservices.log.common.TagContent;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PutLogsRequest;
import com.aliyun.openservices.log.response.GetContextLogsResponse;
import com.aliyun.openservices.log.response.GetLogsResponse;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class GetContextLogsSample {

    private static int getCurrentTimestamp() {
        return (int) (new Date().getTime() / 1000);
    }

    private static class PackInfo {
        public String packID;
        public String packMeta;

        public PackInfo(String id, String meta) {
            this.packID = id;
            this.packMeta = meta;
        }
    }

    private static PackInfo extractPackInfo(QueriedLog log) {
        PackInfo ret = new PackInfo("", "");
        ArrayList<LogContent> contents = log.GetLogItem().GetLogContents();
        for (int i = 0; i < contents.size(); ++i) {
            LogContent content = contents.get(i);
            if (content.GetKey().equals("__tag__:__pack_id__")) {
                ret.packID = content.GetValue();
            } else if (content.GetKey().equals("__pack_meta__")) {
                ret.packMeta = content.GetValue();
            }
        }
        return ret;
    }

    public static void main(String args[]) throws InterruptedException, LogException {
        // 日志服務的服務接入點。此處以杭州為例,其它地域請根據實際情況填寫。
        String endpoint = "https://cn-hangzhou.log.aliyuncs.com"; 
       // 本示例從環境變量中獲取 AccessKey ID 和 AccessKey Secret。
        String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); 
        // 待查詢的 Project 名稱。
        String project = "ProjectName"; 
       // 待查詢的 Logstore 名稱。
        String logstore = "logstoreName"; 
        // 構建一個客戶端實例。
        Client client = new Client(endpoint, accessKeyId, accessKeySecret);

        System.out.println("請確保指定的 logstore 已開啟索引。");
        Thread.sleep(3000);

        // 使用 GetLogs 并在查詢語句中加上|with_pack_meta 來獲取起始日志的 pack_id 和 pack_meta。
        // 查詢時間范圍:最近 15 分鐘。
        // 起始日志:返回結果的第一條。
        String query = "*|with_pack_meta";
        GetLogsResponse response = client.GetLogs(project, logstore,
                (int) getCurrentTimestamp() - 900, (int) getCurrentTimestamp(),"", query);
        ArrayList<QueriedLog> logs = response.GetLogs();
        if (logs.isEmpty()) {
            System.out.println("未查詢到任何日志。");
            System.exit(1);
        }

        // 提取第一條日志的 pack 信息。
        PackInfo info = extractPackInfo(logs.get(0));
        if (info.packMeta.isEmpty() || info.packID.isEmpty()) {
            System.out.println("pack ID: " + info.packID + ", pack meta: " + info.packMeta);
            System.out.println("起始日志的 pack 信息不完整,請確保該日志是通過 logtail 寫入。");
            System.exit(1);
        }

        // 使用得到的 pack 信息進行上下文查詢(雙向查詢)。
        GetContextLogsResponse contextRes = client.getContextLogs(project, logstore,
                info.packID, info.packMeta, 10, 10);
        System.out.println("雙向查詢");
        System.out.println("pack ID: " + info.packID + ", pack meta: " + info.packMeta);
        System.out.println("is complete: " + contextRes.isCompleted());
        System.out.println("total lines: " + contextRes.getTotalLines());
        System.out.println("back lines: " + contextRes.getBackLines());
        System.out.println("forward lines: " + contextRes.getForwardLines());
        Thread.sleep(1000);

        // 使用查詢結果中的第一條日志,向前查詢上文(單向),至多三次。
        List<QueriedLog> contextLogs = contextRes.getLogs();
        for (int i = 0; i < 3 && !contextLogs.isEmpty(); i++) {
            QueriedLog log = contextLogs.get(0);
            info = extractPackInfo(log);
            GetContextLogsResponse res = client.getContextLogs(project, logstore,
                    info.packID, info.packMeta, 10, 0);
            System.out.println("向前查詢上文");
            System.out.println("pack ID: " + info.packID + ", pack meta: " + info.packMeta);
            System.out.println("is complete: " + res.isCompleted());
            System.out.println("total lines: " + res.getTotalLines());
            System.out.println("back lines: " + res.getBackLines());
            System.out.println("forward lines: " + res.getForwardLines());
            contextLogs = res.getLogs();

            Thread.sleep(1000);
        }

        // 使用查詢結果中的最后一條日志,向后查詢下文(單向),至多三次。
        contextLogs = contextRes.getLogs();
        for (int i = 0; i < 3 && !contextLogs.isEmpty(); i++) {
            QueriedLog log = contextLogs.get(contextLogs.size() - 1);
            info = extractPackInfo(log);
            GetContextLogsResponse res = client.getContextLogs(project, logstore,
                    info.packID, info.packMeta, 0, 10);
            System.out.println("向后查詢下文");
            System.out.println("pack ID: " + info.packID + ", pack meta: " + info.packMeta);
            System.out.println("is complete: " + res.isCompleted());
            System.out.println("total lines: " + res.getTotalLines());
            System.out.println("back lines: " + res.getBackLines());
            System.out.println("forward lines: " + res.getForwardLines());
            contextLogs = res.getLogs();

            Thread.sleep(1000);
        }
    }
}