1

我正在尝试通过发送参数来获取 CloudWatchLogs filterLogEvents。有时它会工作并向我发送当时的确切日志,但对于不同的 lambda 函数,它会返回带有下一个令牌的空事件。

参数 = {

“logGroupName”:metricFilter.logGroupName,“filterPattern”:metricFilter.filterPattern?metricFilter.filterPattern : "", 'startTime' : 时间戳 - 偏移量, 'endTime' : 时间戳 };

我正在通过发送带有下一个令牌的参数来重试,但它仍然收到空事件。有人知道吗?

{
    "events": [],
    "searchedLogStreams": [],
    "nextToken": "long text"
}
4

2 回答 2

0

当我尝试使用 aws sdk 捕获 aws could 监视日志时,我遇到了同样的问题。

当我使用 logStreamNamePrefix 时,我终于解决了这个问题,在我的例子中是设备的 uuid。

所以我创建了下面的函数,当我第一次运行它时,我在没有 nextToken 的情况下执行它,随后我在请求中获取令牌并使用令牌再次调用它以继续搜索。

loadCloudWatchLogs(nextToken?: string) {
  // Set the region
  AWS.config.update({
    region: 'sa-east-1',
    credentials: {
      accessKeyId: environment.awsAccessKeyId,
      secretAccessKey: environment.awsSecretAccessKey,
    },
  });

  // Create the CloudWatchLogs service object
  const cloudwatchlogs = new AWS.CloudWatchLogs({ apiVersion: '2014-03-28' });

  // Defines the params attributes pattern.
  let params: AWSCloudWatchParams;

  // Check if token was provided to permorm a next query to AWSCloudWatchLogs.
  if (nextToken) {
    params = {
      logGroupName: 'group-name' /* required */,
      startTime: this.startTime,
      endTime: this.endTime,
      logStreamNamePrefix: this.device,
      filterPattern: `{ ($.device="${this.device}") }`,
      nextToken,
    };
  } else {
    params = {
      logGroupName: 'group-name' /* required */,
      startTime: this.startTime,
      endTime: this.endTime,
      logStreamNamePrefix: this.device,
      filterPattern: `{ ($.device="${this.device}") }`,
    };
  }

  // Execute a filter for logs.
  cloudwatchlogs.filterLogEvents(params, (err, data) => {
    if (err) {
      console.log(err, err.stack);
    } else {
      if (data.searchedLogStreams.length > 0) {
        // Chegk if exists more logs for query.
        const loadMoreLogs = !data.searchedLogStreams[
          data.searchedLogStreams.length - 1
        ].searchedCompletely;

        // Update the token for the next query.
        this.nextToken = data.nextToken;

        data.events.forEach(log => {
          // log proccessing...
        });
      }
    }
  });
}

这个功能我在一个 Angular 项目中做的,但即使对 javascript vanila 进行一些调整,它也可以工作。

于 2020-09-21T02:35:46.497 回答
0

您之前可能已经使用Cloudwatch Log Insights的查询进行了测试,然后通过StartQuery API 进行了测试,并注意到您目前无法对结果GetQueryResults进行分页。

为了克服 10000 条记录的限制,您可能已经尝试过支持分页的FilterLogEvents。如果是这种情况,请注意 FilterLogEvents 中的参数startTimeendTime以毫秒为单位指定,而 StartQuery 中的参数startTimeendTime必须秒为单位指定。

因此,为了使用用于从startQuery计算startTimeendTime的相同代码,您需要将时间戳值乘以 * 1000。

于 2021-11-15T19:28:25.373 回答