全部产品
Search
文档中心

日志服务:GetContextLogs - 查询上下文日志

更新时间:Sep 15, 2025

调用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);  }  } }