在 python 中使用 boto3 查询 cloudwatch 日志中的不同值

Sim*_*aur 3 python amazon-cloudwatch boto3 amazon-cloudwatchlogs aws-cloudwatch-log-insights

我有一个 lambda 函数,可以将指标写入Cloudwatch. 在写入指标的同时,它会在日志组中生成一些日志。

INFO:: username: simran+test@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local

INFO:: username: simran+test2@abc.com ClinicID: 7669 nodename: MacBook-Pro-3.local

INFO:: username: simran+test@abc.com ClinicID: 7668 nodename: MacBook-Pro-4.local

INFO:: username: simran+test3@abc.com ClinicID: 7667 nodename: MacBook-Pro-5.local

INFO:: username: simran+test3@abc.com ClinicID: 7667 nodename: MacBook-Pro-2.local
Run Code Online (Sandbox Code Playgroud)

我需要一种有效的方法来获取给定的不同值。例如,我传入并期望nodenameClinicId7667ClinicId

['MacBook-Pro-2.local', 'MacBook-Pro-5.local']
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

 query = "fields @timestamp, @message | parse @message \"username: * ClinicID: * nodename: *\" as username, ClinicID, nodename | filter ClinicID = "+ clinic_id

 start_query_response = client.start_query(
        logGroupName=log_group,
        startTime=int(time.mktime((Util.utcnow() - timedelta(hours=hours)).timetuple())),
        endTime=int(time.mktime(Util.utcnow().timetuple())),
        queryString=query,
    )
Run Code Online (Sandbox Code Playgroud)

我考虑过start_query_response用 Python 进行迭代,但我不喜欢这个想法。由于我要查看的是超过的日志7 days,因此我需要一种有效的方法,而不必迭代给定的过去的每个7 days日志ClinicID

Unk*_*nts 5

您可以通过管道将表达式传递给stat命令并计算每个节点名的出现次数。

将其添加到查询的末尾:

| stats count(*) by nodename
Run Code Online (Sandbox Code Playgroud)

结果将是:

{
  'results': [
    [
      {
        'field': 'nodename',
        'value': 'MacBook-Pro-2.local\n'
      },
      {
        'field': 'count(*)',
        'value': '2'
      }
    ],
    [
      {
        'field': 'nodename',
        'value': 'MacBook-Pro-5.local\n'
      },
      {
        'field': 'count(*)',
        'value': '1'
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

有关各种命令的更多详细信息,请参阅此处:https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html